9

私は C++ Primer, 3rd Ed (Lippman and Lajoie) を読んでいますが、要素を追加するためのスペースを作るためにベクトルを再割り当てする必要がある場合は、push_back()、要素は新しいスペースでコピー構築され、次に古い要素でデストラクタが呼び出されます。なぜこれが必要なのか混乱しています-なぜデータをビットごとにコピーできないのですか? 答えは動的メモリ割り当てに関係していると思いますが、現在の推論では、ベクトル要素が動的メモリを処理しても、要素に実際に格納されているデータはポインターになります。つまり、ビット単位のコピーでは、それらが指す場所が保持されます。問題はありません。要素が指す動的に割り当てられたメモリの再配置が問題になることはわかりますが、これはポインターを無効にするためですが、ベクトルの再配置にはそれを行う理由がないことがわかります。

誰かが少しずつ動かすべきではないクラスの簡単な例を教えてもらえますか?

4

2 に答える 2

8

これはおそらく最も単純な (ただしかなり不自然な) 例です。

class foo
{
  int i;
  int* pi; // always points to i
};

piここで、コピー コンストラクターは を指す不変条件を維持しiます。コンパイラ自体はこの関係を独自に把握できないため、コピー コンストラクタを呼び出す必要があります。

于 2012-06-23T04:52:49.657 に答える
4

誰かが少しずつ動かすべきではないクラスの簡単な例を教えてもらえますか?

標準では、C++03 の POD ではない (または C++11 で自明にコピー可能な)クラスでamemcpy実行すると、資格が得られます。非 POD (または自明でないコピー可能) を ing すると、未定義の動作が呼び出されます。したがって、実際のコピー (または C++11 では移動) コンストラクターを使用する必要があります。memcpy

POD型ではないため、それstd::vector 自体が適用されます (また、C++11 では簡単にコピーできません)。

于 2012-06-23T05:30:38.253 に答える