条款17:以独立语句将 newed 对象置入智能指针

Store newed objects in smart pointers in standalone statements.

假设有以下两个接口:

int priority();
void processWidget(std::tr1::shared_ptr<Widget> pw, int priority);

如果使用不当,会导致内存泄漏:

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

这行代码可以通过编译,但在编译器产出一个 processWidget 调用码之前,会先核实即将被传递的各个实参。第二个实参只是单纯的对 priority 函数的调用,但第一个实参由两部分组成:

  • 执行 new Widget 表达式;

  • 调用 tr1::shared_ptr 构造函数;

于是在调用 processWidget 之前,编译器必须创建代码,做以下三件事情:

  • 调用 priority

  • 执行 new Widget

  • 调用 tr1::shared_ptr 构造函数;

但是这三件事的执行顺序没有被明确定义,如果最终获得这样的操作序列:

  1. 执行 new Widget

  2. 调用 priority

  3. 调用 tr1::shared_ptr 构造函数;

这种情况下,如果在调用 priority 函数时导致异常,此时 new Widget 返回的指针将会遗失,这会导致资源泄漏。所以为了避免这类问题,应该分离语句(1)创建 Widget(2)再将它置入一个智能指针,最后再传入 processWidget 函数。

Last updated

Was this helpful?