条款17:以独立语句将 newed 对象置入智能指针
Store newed objects in smart pointers in standalone statements.
假设有以下两个接口:
如果使用不当,会导致内存泄漏:
这行代码可以通过编译,但在编译器产出一个 processWidget
调用码之前,会先核实即将被传递的各个实参。第二个实参只是单纯的对 priority
函数的调用,但第一个实参由两部分组成:
执行
new Widget
表达式;调用
tr1::shared_ptr
构造函数;
于是在调用 processWidget
之前,编译器必须创建代码,做以下三件事情:
调用
priority
;执行
new Widget
;调用
tr1::shared_ptr
构造函数;
但是这三件事的执行顺序没有被明确定义,如果最终获得这样的操作序列:
执行
new Widget
;调用
priority
;调用
tr1::shared_ptr
构造函数;
这种情况下,如果在调用 priority
函数时导致异常,此时 new Widget
返回的指针将会遗失,这会导致资源泄漏。所以为了避免这类问题,应该分离语句(1)创建 Widget(2)再将它置入一个智能指针,最后再传入 processWidget
函数。
Last updated
Was this helpful?