0

学校で、課題を完了するために申請書を書かなければなりません。そのためには、動的配列を作成する必要があります。私の質問は:

  1. 動的ポインタを含む構造体を作成してコピーすると、メモリもコピーされますか?

    例えば:

    struct SomePointerStruct
    {
         int* p_array;
    }
    

    その構造をコピーするとどうなりますか? また、

  2. 元のポインターをクリーンアップする必要がありますか?

4

3 に答える 3

3

デフォルトでは、c++ のオブジェクトはバイト単位でコピーされます。つまり、ポインターがコピーされ、同じ配列を指す 2 つのポインターが取得されます。

これを修正するには、 を実装する必要があり、copy constructorもオーバーライドする必要がありますoperator=。また、終了時にこの配列を削除したい場合があるため、destructor. それが「3の法則」です。

于 2013-10-31T14:51:18.160 に答える
1

動的ポインタを含む構造体を作成してコピーすると、メモリもコピーされますか?

いいえ。

C++ 言語の設計の多くは、「必要のないものにお金を払う必要はない」という勅令によって規定されています。これがうまくいく 1 つの方法は、何かをディープ コピーしたい場合は、自分で行う必要があるということです。

元のポインターをクリーンアップする必要がありますか?

一般的に、はい。

すべてnewの に対して、一致する が 1 つだけ存在する必要がありますdelete。をインスタンス化しSomePointerStruct、その構築で を呼び出すnew場合、それはおそらくのデストラクタのdeleteどこかで必要になります。SomePointerStructのコピーを作成し、SomePointerStructそのコピーが元のポインターをディープ コピーする ( を呼び出すnew) 場合、それはdelete必要な秒数です。

于 2013-10-31T14:50:45.073 に答える
1

C++ の本のMemoryという名前の章全体を繰り返さないようにするために、次のように答えます。

生のポインタはメモリを所有すべきではありません。

結果として:

struct SomePointerStruct { int x; }

自明にコピー可能であり、かつ:

struct SomePointerStruct { std::unique_ptr<int> x; } 

コピーできません (ただし、移動可能です)。これは、他のすべてのタイプに拡張されます (適切に構築されている場合)、おそらく「自明」ではありません。元の例でポインター値がコピーされるという事実は、もちろん多くの問題につながりますが、上で書いたものを使用することで簡単に回避できるため、WRT のような単純な割り当ての範囲外です。

まったく別のことは、コピーされた構造体がもちろんメモリの同じ領域を指す非所有ポインターの場合です。ただし、ポインターが有効な場所を指しているという保証がすべて失われるため、参照が優先されます。


動的配列の作成に関しては、単純にstd::vector.

于 2013-10-31T14:52:20.220 に答える