码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2014-06-16 11:31:09      阅读:296      评论:0      收藏:0      [点我收藏+]

标签:style   class   blog   code   color   get   

(一)

假设有下面这两个函数:

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

现在这样调用它:

processWidget(new Widget, priority());

但是!上面这种调用不能通过编译,因为tr1::shared_ptr构造函数需要一个原始指针,但是,这个构造函数是explicit构造函数,无法进行隐式转换。

要通过编译的话,要像下面这种调用方式:

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

但是!!这种调用方式可能出现资源泄露!

原因:

c++编译器以什么次序完成这些事情,弹性很大,但是“new Widget”一定在tr1::shared_ptr之前,因为new Widget的结果还要被传递作为tr1::shared_ptr构造函数的一个实参。但对priority的调用可能排在第一或第二或第三。如果编译器选择第二顺位执行它:

1、执行“new Widget”

2、调用“priority()”

3、调用tr1::shared_ptr构造函数

万一对priority的调用导致异常,会发生什么事情?new Widget返回的指针将会遗失。因为它尚未置入tr1::shared_ptr中。

避免这类问题的办法:使用分离语句:

tr1::shared_ptr<Widget> pw(new Widget);//在单独语句内以智能指针存储newed所得对象。 
processWidget(pw, priority());

 

 

请记住:

以独立语句将newed对象存储于(置入)智能指针内。如果不这样做,一旦异常被抛出,有可能导致难以察觉的资源泄漏。

 


 


 

Effective C++:条款17:以独立语句将newed对象置入智能指针,布布扣,bubuko.com

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

标签:style   class   blog   code   color   get   

原文地址:http://blog.csdn.net/u010470972/article/details/30082613

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!