6

次のコードはどうですか

MyClass a(new Foo(), new Bar());

「new Foo()」が成功しても「new Bar()」がスローされた場合、Foo はリークしますか?

とっている

std::unique_ptr<Foo>

また

std::shared_ptr<Foo>

パラメータとして、リークを防ぐのに十分ですか?

4

1 に答える 1

6

「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())

これは、コンパイラが上記の式を次の順序で評価できるためです。

  1. 式を評価するnew Foo()
  2. 式を評価するnew Bar()
  3. std::unique_ptr<Foo>1 の結果からテンポラリを構築します。
  4. 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 つの操作 (スマート ポインターの動的割り当てと構築) が他の操作とインターリーブされることなく、作成したオブジェクトを対応するスマート ポインターに即座に関連付けるため、リークが発生する可能性はありません。

于 2013-06-28T00:25:26.850 に答える