当堆分配的构造函数参数抛出c ++时

时间:2013-11-11 18:35:34

标签: c++ memory-leaks

Effective C++第17项中,有一个函数调用可能泄漏的例子:

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

根据该书,如果首次创建新窗口小部件,则会发生泄漏。然后调用优先级,但它会抛出,在这种情况下,共享指针从未创建,新的Widget被泄露。

据我所知,这样的电话不会泄漏:

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

但是在这种情况下,如果新的Widget抛出,为什么没有内存泄漏呢?或者是唯一安全的方法(如果是这样,那有什么不同?)

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

1 个答案:

答案 0 :(得分:1)

如果new Widget抛出则会自动释放内存(如果它已经分配了它);所以第二个例子很好。

但是,最好使用make_shared,因为只需为对象和引用计数分配单个块,就可以更有效地使用内存。