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

 

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

上诉调用可能泄露资源:

编译器产出一个processWidget调用之前,必须首先核算即将被传递的各个参数,上述第二个实参只是一个单纯的对priority函数调用,但第一个参数std::tr1::shared_ptr<Widget>(new Widget) 由两部分组成:

1.执行“new Widget”表达式

2.调用tr1::shared_ptr构造函数

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

1.调用priority

2.执行“new Widget”表达式

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

在对processWidget的调用过程中可能引发资源泄露,因为在“资源被创建”和“资源被转换为资源管理对象”两个时间点之前有可能发生异常干扰。

避免这类问题的办法很简单:使用分离语句,分别写出1.创建Widget,2.将它置入一个智能指针内,然后在把那个智能指针传给processWidget:

  
  
  
  
  1. std::tr1::shared_ptr<Widget> pw(new Widget); 
  2. processWidget(pw, priority()); 

 

 

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

 

 

 

 

 

 

 

 

你可能感兴趣的:(职场,休闲,智能)