0

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

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

根据这本书,如果第一次创建新的小部件,就会发生泄漏。然后优先级被调用,但它抛出了,在这种情况下,共享指针从未被创建并且新的 Widget 被泄露。

据我了解,这样的电话不会泄漏:

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

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

但是,无论如何使用它是一个好主意make_shared,因为它通过为对象和引用计数分配一个块来更有效地使用内存。

于 2013-11-11T18:39:14.603 回答