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

如果想要一个函数来获取程序的优先权(int priority()),另一个函数用来处理在某些动态分配所得到的资源进行优先权的处理(void processWidget(std::trl::shared_ptr<Widget> pw, int priority))
 
由于资源获取就是初始化,根据第13条款:,对动态分配来的Widget使用智能指针,这里用到了trl::shared_ptr

假设某处调用processWidget;
 
processWidget(new Widget,priority());
由于trl::shared_ptr的构造函数需要原始指针,而这个构造函数是explicit的,不允许进行隐式转换,这样写不能通过编译。
需要将new Widget转换成shared_ptr要求的形式。
processWidget(trl::shatrd_ptr<Widget> (new WIdget),priority());这样就可以通过编译。
 
编译器在调用processWidget时,需要提前核算出被传递的各个实参。
这样的话processWidget就需要做3件事:
1.调用priority;
2.执行“new Widget”;
3.调用trl::shared_prt构造函数。
C++并没有规定对实参进行特定顺序的核算(java有这种行为定义)。如果编译器能够以下面的顺序完成实参的核算最好不过:
1.执行“new Widget”;
2.调用priority;
3.调用trl::shared_ptr;
但是,万一对priority()调用异常,可能new返回的指针会遗失,此时它并未置入trl::shared_ptr内。这样的话,调用processWidget()时就会发生资源泄露。因为创建资源后并未能够转换为资源管理对象,这两个时间点之间可能发生了异常导致资源泄露。
 
如何避免呢?把实参语句分离出去。分别写出:
1. new Widget
2.将它置入一个智能指针内,然后把那个智能指针传给processWidget();
 
std::trl::shared_ptr<Widget> pw(new Widget);
processWigdet(pw,priority());//这样的话就不会造成资源泄露
 
记住:
    以独立语句将new得到的对象存储于智能指针内。如果不这样做,一旦异常被抛出,则有可能导致难以察觉的资源泄露。

 

posted @ 2017-04-28 19:39  弗莱曼飞侠  阅读(153)  评论(0编辑  收藏  举报