次のコードはどうですか
MyClass a(new Foo(), new Bar());
「new Foo()」が成功しても「new Bar()」がスローされた場合、Foo はリークしますか?
とっている
std::unique_ptr<Foo>
また
std::shared_ptr<Foo>
パラメータとして、リークを防ぐのに十分ですか?
次のコードはどうですか
MyClass a(new Foo(), new Bar());
「new Foo()」が成功しても「new Bar()」がスローされた場合、Foo はリークしますか?
とっている
std::unique_ptr<Foo>
また
std::shared_ptr<Foo>
パラメータとして、リークを防ぐのに十分ですか?
「new Foo()」が成功しても「new Bar()」がスローされた場合、Foo はリークしますか?
はい。
リークを防ぐのに十分なパラメーターとして [...] を使用していますか?
必ずしも。パラメータを渡す方法によって異なります。たとえば、クラス コンストラクターが次のようになっているとします。
MyClass::MyClass(std::unique_ptr<Foo> foo, std::unique_ptr<Bar> bar)
次の場合でも、リークが発生する可能性があります。
MyClass a(std::unique_ptr<Foo>(new Foo()), std::unique_ptr<Bar>(new Bar())
これは、コンパイラが上記の式を次の順序で評価できるためです。
new Foo()
new Bar()
std::unique_ptr<Foo>
1 の結果からテンポラリを構築します。std::unique_ptr<Bar>
2 の結果からテンポラリを構築します。2) で例外がスローされた場合は、Foo
.
ただし、次のようにstd::make_unique<>()
(C++14 のみ) またはを使用して、これを安全にすることができstd::make_shared<>()
ます。
MyClass a(std::make_unique<Foo>(), std::make_unique<Bar>());
std::make_unique<>()
(およびstd::make_shared<>()
) これら 2 つの操作 (スマート ポインターの動的割り当てと構築) が他の操作とインターリーブされることなく、作成したオブジェクトを対応するスマート ポインターに即座に関連付けるため、リークが発生する可能性はありません。