条款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());
这样就可以高枕无忧了.
小结:
以独立的语句将对象存储于智能指针中,如果不这么做,那么异常一旦抛出,可能导致难以察觉的资源泄露