More than code

More Than Code
The efficiency of your iteration of reading, practicing and thinking decides your understanding of the world.
  1. 首页
  2. daily
  3. 正文

Daily C/C++ 隐含的资源泄露

2021年6月7日 538点热度 0人点赞 0条评论

隐含的资源泄露

原文章是《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());
标签: c++
最后更新:2021年6月7日

sheep

think again

点赞
< 上一篇
下一篇 >

文章评论

取消回复

COPYRIGHT © 2021 heavensheep.xyz. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS