2017-10-22 8 views
0

私は数日前からunique_ptrで作業していましたが、リリース方法についてはunique_ptrという質問があります。私はリリースが"管理対象オブジェクトへのポインタ、またはnullptr管理対象オブジェクトがない場合"を返すことを知っています。unique_ptrのrelease()in C++

は、我々は3つのunique_ptr変数考えてみましょう:これは、任意のメモリリークを引き起こす

middle.release(); 
right.release(); 
left.release(); 

middle.reset(right.get()); 
right.reset(left.get()); 
left.reset(middle.get()); 

unique_ptr<Node> left(Node); 
unique_ptr<Node> right(Node); 
unique_ptr<Node> middle(Node); 

を今、私はそれらの内部ポインタを変更したいですか? release()によって返された値を格納して使用する方が良いか、それともこの方法でうまくいくのですか?

+0

あなたはちょうど '恐ろしいリリース –

答えて

1

あなたは漏れています! releaseはポインタを無効にします。あなたは元のオブジェクトポインタを失う。

は何が欲しいのは、単に二回交換することによって達成される:cppreference.comrelease()によると

middle.swap(right); 
right.swap(left); 
+0

なしreset'を呼び出すことができ、私は最良の答えとしてこれを受け入れます:) – Siyavash

+0

何を?だから、質問をした人は答えを受け入れることができないのですか? – rustyx

+0

@RustyX - IIRCは15分のコールドダウン時間があります。渡す前に受け入れることはできません – StoryTeller

2

には、以下のん:いずれかの場合

は、管理対象オブジェクトの所有権を解放します。 get()は、呼び出しの後にnullptrを返します。

一度すべてのオブジェクトをリリースすると、あなたはあなたのポインタを失ってしまいました!そして、彼らはunique_ptr -sで所有されていたので、彼らは現在野生です!

代わりに、慎重に同じ目標を達成するために使用スワップ:SO私はできたときに

right.swap(middle); // middle = right, right = middle 
right.swap(left); // left = right = (old) middle, right = left