在Effective C++第 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 );
最佳答案
如果 new Widget
抛出,那么内存将自动释放(如果它已经分配完毕);所以第二个例子没问题。
但是,无论如何使用make_shared
是个好主意,因为它通过为对象和引用计数分配一个 block 来更有效地使用内存。
关于c++ - 当堆分配的构造函数参数抛出 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19913376/