ツリーの挿入機能を使用して、データパラメータのディープコピーを含む新しいノードを作成しました。データ構造にデータを挿入するときに深いまたは浅いコピーがありますか?
ブロック1:
insert(Object* toInsert){
...
Node temp;
temp->data = new Object(*toInsert); //deep copy toInsert
...
}
私はそれはプライバシーの漏洩を回避するので、これはより強固な実装だった考え出し。しかし、別のコンポーネント(profによって与えられる)がinsert()に渡すオブジェクトを削除しないため、メモリリークが発生しました。私のデストラクタはノードを正しく割り当て解除しますが、元のデータはinsert()に渡されません。
Iは、ブロック2 2
をブロックするために自分のコードを変更することによって、メモリリークを修正:
insert(Object* toInsert){
...
Node temp;
temp->data = toInsert; //directly toInsert to data
...
}
Iは、第三の溶液を考え、私の挿入機能は、別のコンポーネントのメモリを管理するべきではないことを決めました。
ブロック3:
insert(Object* toInsert){
...
Node temp;
temp->data = new Object(*toInsert); //deep copy toInsert
delete toInsert; //manages another component's memory
...
}
私の腸は私に語ったが、ブロック3には、外出先ではありません。私は正しいですか?
データ構造を扱うときは、ブロック2のように直接データを挿入するか、ブロック1のようにディープコピーを作成する方が良いでしょうか?
おかげ
3番目のオプションは無意味です。あなたがポイントにパラメータを持っていれば、 'insert'の間に' delete 'することができます。あなたのツリーノードがそれを満たし、不要なalloc +コピーを避けるまで、*保持することができるポイントまで所有します。私はプランBに行き、その*意思があなたの木に所有権を渡すのであればあなたの教授と明確にすることで決定を確認します。 – WhozCraig
[標準コンテナ](http:// en。 cppreference.com/w/cpp/container)は、すべてのメンバーに標準コピーを使用します。つまり、ポインターのコンテナがある場合はポインタがコピーされ、オブジェクトのコンテナがある場合はオブジェクトのコピーまたは移動コンストラクターが呼び出されます。コピーまたは移動代入演算子が呼び出されます。次に、コピー/移動セマンティクスを実装するのは各クラスに任されます。 –