2012-06-23 7 views
6

私はC++ Primer、3rd Ed(LippmanとLajoie)を読んでいます.で追加された要素のスペースを増やすためにベクトルを再割り当てする必要がある場合、その要素は新しい空間でコピーコンストラクションされ、デストラクタは古い要素に対して呼び出されます。私はなぜこれが必要なのか混乱しています - なぜデータはビット単位でコピーできませんか?答えは動的メモリ割り当てと関係があると考えていますが、私の現在の考え方は、ベクトル要素が動的メモリを扱っても、実際に要素に格納されているデータはポインタになります。つまり、ビット単位のコピーでは、問題を提示することはありません。ポインタが無効になるので、要素が指し示す動的に割り当てられたメモリをどのように再配置するのが問題なのかを知ることができますが、ベクトルの再配置がその理由を持たないことがわかります。C++:自動ベクトル再配置によりコピーコンストラクタが呼び出されますか?どうして?

ビットごとに移動してはいけないクラスの簡単な例を教えてもらえますか?ここで

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

は、コピーコンストラクタは不変を維持することiからpiポイント:

+2

コンストラクタ/デストラクタがクラスのアドレスを親オブジェクトで登録/登録解除するシナリオが思い浮かびます。 –

+1

タイプが賢くコピーできないシナリオが思い浮かびます。 –

+1

ta.spot.isには実例がありますが、私はすべてのオブジェクトレジストリを "親"と呼んでいません。これとは別に、いくつかのクラスは、自分のデータメンバーへのポインタを保持しているかもしれません - 例えば、いくつかのモーダル状態をモデル化し、将来のオペレーションがその特定のメンバに影響を与えるべきである、あるいはイテレータを内部ベクトルに持つべきです。 –

答えて

7

はここでおそらく最も簡単な(しかしむしろ不自然)の例です。コンパイラ自体はこの関係を単独で把握できないため、コピーコンストラクタを呼び出す必要があります。

4

ビット単位で移動しないクラスの簡単な例を教えてもらえますか?規格で

a POD in C++03 (or trivially copyable in C++11)ではありません任意のクラスは資格うmemcpyを行います。非POD(または非自明にコピー可能)は、未定義の動作を呼び出します。したがって、実際のコピー(またはC++ 11で移動)コンストラクタを使用する必要があります。

従ってstd::vectorそれはPODタイプではないので(C++ 11ではそれは簡単にはコピーできません)

関連する問題