2016-10-22 7 views
0

ツリーの挿入機能を使用して、データパラメータのディープコピーを含む新しいノードを作成しました。データ構造にデータを挿入するときに深いまたは浅いコピーがありますか?

ブロック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のようにディープコピーを作成する方が良いでしょうか?

おかげ

+2

3番目のオプションは無意味です。あなたがポイントにパラメータを持っていれば、 'insert'の間に' delete 'することができます。あなたのツリーノードがそれを満たし、不要なalloc +コピーを避けるまで、*保持することができるポイントまで所有します。私はプランBに行き、その*意思があなたの木に所有権を渡すのであればあなたの教授と明確にすることで決定を確認します。 – WhozCraig

+3

[標準コンテナ](http:// en。 cppreference.com/w/cpp/container)は、すべてのメンバーに標準コピーを使用します。つまり、ポインターのコンテナがある場合はポインタがコピーされ、オブジェクトのコンテナがある場合はオブジェクトのコピーまたは移動コンストラクターが呼び出されます。コピーまたは移動代入演算子が呼び出されます。次に、コピー/移動セマンティクスを実装するのは各クラスに任されます。 –

答えて

2

所有権の移転に関して引数の彼らの治療が明確であることをように、あなたのインターフェイス機能の署名を選択します。関数コピー入力引数オプション1について

、(CONST)基準ではなく、ポインタを介してオブジェクトを渡し:

insert(const Object& toInsert){ 
    ... 
    Node temp; 
    temp->data = new Object(toInsert); //deep copy toInsert 
    ... 
} 

関数は、引数オブジェクトの所有権を仮定オプション2についてオブジェクトをstd::unique_ptrに渡します。

insert(std::unique_ptr<Object> toInsert){ 
    ... 
    Node temp; 
    temp->data = toInsert.release(); 
    ... 
} 

オプション3は意味がありません。

+0

ありがとうございます。残念ながら私はstd :: unique_ptrを使うことはできません。なぜなら学校のLinuxラボでは'98コンパイラを使用しているので、プレーンなポインタを使わなければなりません。 – shtuken

+1

@shtuken古いコンパイラでは 'std :: auto_ptr'(これは' std :: unique_ptr'の先祖です)を使うことができます。 – Leon

関連する問題