在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 );
答案 0 :(得分:1)
如果new Widget
抛出则会自动释放内存(如果它已经分配了它);所以第二个例子很好。
但是,最好使用make_shared
,因为只需为对象和引用计数分配单个块,就可以更有效地使用内存。