学校で、課題を完了するために申請書を書かなければなりません。そのためには、動的配列を作成する必要があります。私の質問は:
動的ポインタを含む構造体を作成してコピーすると、メモリもコピーされますか?
例えば:
struct SomePointerStruct { int* p_array; }
その構造をコピーするとどうなりますか? また、
元のポインターをクリーンアップする必要がありますか?
デフォルトでは、c++ のオブジェクトはバイト単位でコピーされます。つまり、ポインターがコピーされ、同じ配列を指す 2 つのポインターが取得されます。
これを修正するには、 を実装する必要があり、copy constructor
もオーバーライドする必要がありますoperator=
。また、終了時にこの配列を削除したい場合があるため、destructor
. それが「3の法則」です。
動的ポインタを含む構造体を作成してコピーすると、メモリもコピーされますか?
いいえ。
C++ 言語の設計の多くは、「必要のないものにお金を払う必要はない」という勅令によって規定されています。これがうまくいく 1 つの方法は、何かをディープ コピーしたい場合は、自分で行う必要があるということです。
元のポインターをクリーンアップする必要がありますか?
一般的に、はい。
すべてnew
の に対して、一致する が 1 つだけ存在する必要がありますdelete
。をインスタンス化しSomePointerStruct
、その構築で を呼び出すnew
場合、それはおそらくのデストラクタのdelete
どこかで必要になります。SomePointerStruct
のコピーを作成し、SomePointerStruct
そのコピーが元のポインターをディープ コピーする ( を呼び出すnew
) 場合、それはdelete
必要な秒数です。
C++ の本のMemoryという名前の章全体を繰り返さないようにするために、次のように答えます。
結果として:
struct SomePointerStruct { int x; }
自明にコピー可能であり、かつ:
struct SomePointerStruct { std::unique_ptr<int> x; }
コピーできません (ただし、移動可能です)。これは、他のすべてのタイプに拡張されます (適切に構築されている場合)、おそらく「自明」ではありません。元の例でポインター値がコピーされるという事実は、もちろん多くの問題につながりますが、上で書いたものを使用することで簡単に回避できるため、WRT のような単純な割り当ての範囲外です。
まったく別のことは、コピーされた構造体がもちろんメモリの同じ領域を指す非所有ポインターの場合です。ただし、ポインターが有効な場所を指しているという保証がすべて失われるため、参照が優先されます。
動的配列の作成に関しては、単純にstd::vector
.