1

クラスオブジェクトのベクトルがあります。関数はランダムに 2 つの要素を選択し、それらのアドレスを返します。

これら 2 つの要素を使用して、同じクラスの 2 つの新しいオブジェクトを生成し、push_back を使用してそれらをベクターに追加します。

2 つの親要素のアドレスは次のとおりです。

ここでは問題ありません。最初の子オブジェクトが生成され、vector_pushback を使用してベクターの末尾に追加します。問題は、push_back コマンドが実行された後、親オブジェクトのアドレスが変更されたように見えることです。push_back 後のデバッガーの状態は次のとおりです。

ご覧のとおり、アドレスは明らかに同じままですが、push_back の後でガベージ値を指しているように見えます。私の理解では、push_back はベクターの最後に要素を追加します。したがって、2 つの要素のアドレスはまったく変更されないと予想されます。

どうしたの?

4

2 に答える 2

11

TL;DR バージョン:

挿入操作は、 の要素へのポインター、参照、または反復子を無効にする可能性がありstd::vectorます。

完全な説明:

Astd::vectorには、次の 2 つの有用なメトリックがあります。

  • size、これは格納された要素の数です。
  • capacity、これは現在格納できる要素の数です。

capacity >= size常に。

これcapacityは、動的に割り当てられた内部配列の長さです。* 要素を挿入すると、sizeが 1 ずつ増加しcapacityますcapacity。これには、すべての要素をコピーし、元の要素を削除する必要があります。したがって、すべてのアドレスが変更されます。


* これは、 の典型的な内部実装ですstd::vector

于 2013-03-19T22:30:01.520 に答える
2

push_back要素ストレージに現在割り当てられているスペースに新しい要素を含めることができない場合、ベクトル内のすべての要素の再割り当てと移動が発生する可能性があります。

于 2013-03-19T22:30:02.003 に答える