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

标签 c++ memory-leaks

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/

相关文章:

c++ - std::unique_ptr<> 作为基于节点的结构中的指针

c++ - 如何使用递归 QMutex

c++ - 为什么串口发送数据时会跳数据?

c++ - 原始引用之间的 static_cast

c++ - 二维数组 - 创建虚拟生物? (C++)

java - Tomcat 线程就绪

android - 分配游标时内存不足

mysql - top 和 htop 命令显示的内存报告困惑?

ios - class_copyIvarList 泄漏

c - 使用 Visual Studio 2013 在 C 中查找内存泄漏