2016-10-05 7 views
1

JavaのGCの概念と同様に、オブジェクトがもう何かによって参照されていない場合、オブジェクトはGC用にマークされます。unique_ptrは参照されないと自動的に破壊されますか?

unique_ptrはこれと同様に動作しますか?

私はノードが左/右std::unique_ptr<BSTNode>を含むデータ構造(ツリー)を持っているとします。もし私がvalを含むBSTNodeの親に行き、nullptrを左か右の子フィールド(std::unique_ptr<BSTNode>valを含む)に割り当てるなら、スマートポインタは自己破壊するでしょうか?remove(std::unique_ptr<BSTNode>& root, int val)がありますか?

また、resetのスマートポインタも削除機能の中に入れる必要がありますか?この質問は主に私が理解していない範囲の問題です。

答えて

1

valを含むBSTNodeの親に行き、左側または右側の子フィールド(これはstd :: unique_ptrがvalを含む)にnullptrを割り当てると、スマートポインタは自己破棄されますか?

スマートポインタは、を指しているものをに破壊します。

自分自身を破壊することはありません(自己破壊とは、ここでは混乱した用語です)。

+0

ああ、私は、スマートポインタが次に範囲を外し、最終的には(それが指しているものを使って)破壊されるのを見ますか?スマートポインタが使用されていないことをどのように知っているかは分かりません。つまり、スマートポインタがnullptrで置き換えられたとすると、それを指し示すものを破棄することはありません。 – Naz

+1

@ Nazスマートポインタは、 "使用されているかどうか"を知りません。 – immibis

+0

unique_ptrは参照カウントされません(shared_ptrと同じです)。そのため、あなたはそれを任意に割り当てることができません(所有権を移すためにstd :: moveを使用する必要があります)。範囲外になると、それが指していたものはすべて破壊されます。もちろん、リセットを呼び出しても同じ効果が得られます(指していたものが破壊されます)。 – Robinson