隐含的资源泄露
原文章是《Effective C++》条款17
以独立语句将newed对象嵌入智能指针
考虑这样一个情况
void processWidget(shared_ptr<Widget>, int);
int priority();
processWidget需要一个智能指针和一个代表优先级的int,其中优先级可以通过priority获得
那么可能的一种写法就是
processWidget(shared_ptr<Widget>(new Widget), priority());
那么在传入processWidget前,我们会先执行new Widget
,priority()
,将新的widget放入智能指针
但是注意,在C++中我们只能保证我们会先执行new Widget
在将其放入智能指针,而对于priority()
的执行,我们是不能确定的
所以我们可能会出现这种情况
执行new Widget
执行priority()
调用智能指针构造函数
那么在这个过程中,如果priority发生了异常,我们刚才获得的资源就会遗失,因为他还没有放到智能指针中进行管理,那么智能指针的析构也就不会帮助我们释放他(智能指针还甚至还没来得及构造)
那么我们就有可能隐式的泄露掉这个资源
解决问题的方法很简单,严格遵守RAII,我们将资源获取和RAII对象的初始化放入一个独立的语句中,就可以保证我们在中途不会被其他的东西打断
即修改成
shared_ptr<Widget> pw(new Widget);
processWidget(pw, priority());
文章评论