2016-12-08 12 views
4

私は約unique_ptr.release()を混同しています。unique_ptrのリリースでメモリリークが発生しますか?

私の目標は、基底クラスのunique_ptrを派生クラスのunique_ptrにキャストすることです。

だから私はこのquestion を発見し、答えは

Derived *tmp = dynamic_cast<Derived*>(basePointer.get()); 
std::unique_ptr<Derived> derivedPointer; 
if(tmp != nullptr) 
{ 
    basePointer.release(); 
    derivedPointer.reset(tmp); 
} 

または

std::unique_ptr<Derived> 
    derivedPointer(static_cast<Derived*>(basePointer.release())); 

ですそれから私はbasePointer.release();後にベースポインタがどうかと思いました。

これを基にして、questionはメモリリークの原因であると私は理解しています。

私は正しいですか?

答えて

12

私はそうですか?

release()を呼び出すと、何も漏洩しない、それはちょうどあなたがそれの制御を取っていることを知らせます。

あなたが明示的にスマートポインタからそれを解放した後、ポインタを漏洩場合、それはあなたののせいです。

+0

したがって、別のunique_ptrにポインタをキャストした場合、それはうまくいくはずですか? – Marc

+0

あなたのコードでは、Benjaminの指示どおりに動作します。 – Useless

+0

ありがとうございます! – Marc

6

ダイナミックに割り当てられたオブジェクトへの最後のポインタを削除する前に、そのポインタを追跡できなくなった場合にメモリリークが発生します。最初にポインタをtmpにコピーしたので、release()を呼び出したときのポインタは失われませんでした。だから、いいえ、ここにメモリリークはありません。

+0

ありがとうございました!まさに私が確かめたいもの。 – Marc

関連する問題