条款17:以独立的语句将资源置入智能指针。

先可考虑下下面这个语句:

 
1 int prioriy();
2 processWidget(shared_ptr<Widget>(new Widget), priority());
上面这条语句看似比较正常,不会泄露资源,但是实际上并非如此。
调用上面这个语句的时候基本上分成三步:
1. new Widget 
2. 根据Widget对象指针来构造shared_ptr
3. 调用priority();
但是c++与java不一样,不一定保证上述语句三部的执行步骤,所以下面这种情况也是可能的:
1. new Widget
2. 调用priority()
3. 根据Widget对象指针来构造shared_ptr
那么问题来了:
如果调用priority的时候抛出遗产,那么Widget资源可能就永远泄露了!!
所以避免这一类问题的方法很简单,就是把这两个步骤分开来写:
1 shared_ptr<Widget> pWgt(new Widget);
2 processWidget(pWgt, priority());
  这样就可以高枕无忧了.
 
小结:
  以独立的语句将对象存储于智能指针中,如果不这么做,那么异常一旦抛出,可能导致难以察觉的资源泄露
posted @ 2015-10-06 19:18  eversliver  阅读(189)  评论(0编辑  收藏  举报