0

有効な C++項目 17 には、関数呼び出しがリークする可能性がある例があります。

processWidget (std::tr1::shared_ptr<Widget> ( new Widget ), priority ());

本によると、新しいウィジェットが最初に作成された場合にリークが発生します。次に優先度が呼び出されますが、スローされます。この場合、共有ポインターは作成されず、新しいウィジェットがリークされます。

私の理解では、このような呼び出しは漏れません:

processWidget (std::tr1::shared_ptr<Widget> ( new Widget ));

しかし、この場合、new Widget がスローすると、なぜメモリ リークがないのでしょうか? または、これを行う唯一の安全な方法です(もしそうなら、それはどう違うのですか?)

auto w = std::tr1::shared_ptr<Widget> ( new Widget );
processWidget ( w );
4

1 に答える 1

1

throws の場合new Widget、メモリは自動的に解放されます (メモリが割り当てられた場合)。したがって、2 番目の例は問題ありません。

ただし、make_sharedオブジェクトと参照カウントの両方に単一のブロックを割り当てるだけでメモリをより効率的に使用できるため、とにかく使用することをお勧めします。

于 2013-11-11T18:39:14.603 に答える