学校で、課題を完了するために申請書を書かなければなりません。そのためには、動的配列を作成する必要があります。私の質問は:
動的ポインタを含む構造体を作成してコピーすると、メモリもコピーされますか?
例えば:
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.