9

このように初期化する場合unique_ptr

std::unique_ptr<Foo> i;
i.reset( new Foo() ); 

しかし、から例外がスローされますFoo::Foo()。問題は、割り当てられたメモリはどうなるのかということです。unique_ptrはどのようにしてリークを回避しますか?newこれはオペレーター内で処理されるものですか?

スコープが終了すると、デストラクタが確実に呼び出されます。reset呼び出しは戻るまで呼び出されないため、例外がコンストラクターを離れるときに割り当てられたメモリを解放することnew Foo()により、これを処理する必要があるようです。new

それはどうなりますか?

4

1 に答える 1

13

のコンストラクターで例外がスローされた場合、一意のポインターFooの関数が最初から実行されることはありません。resetしたがって、一意のポインタは元の値を保持します。

オブジェクト構造が例外をスローしたnew場合、式はメモリをリークしません。

于 2013-01-10T23:36:48.200 に答える