您的位置:首页 > 编程语言 > C语言/C++

读书笔记《Effective c++》 条款17 以独立语句将newed对象置入智能指针

2018-01-09 19:59 295 查看
假设有一个函数:

int priority();
void processWidget(std::share_ptr<Widget> pw, int priority1);


调用的时候可能会这么写:

processWidget(std::share_ptr<Widget>{ new Widget }, priority());


在调用processWidget之前,编译器必须创建代码,做以下三件事:

1.调用priority()

2.执行“new Widget”

3.调用std::shared_ptr构造函数

但是c++编译器可能会对这三件事的顺序隐藏地做出调整,最终的顺序可能是

2->1->3

这样就有一个问题,如果priority()函数出了异常,那么将会导致new Widget执行了,但没有托管给shared_ptr,这样就会有资源泄漏。

避免这个问题很简单,使用分离语句:

std::shared_ptr<Widget> pw{ new Widget };
processWidget(pw, priority());

因为编译器对于“跨语句的各项操作”没有重新排列的自由,只有在语句内它才拥有那个自由度。

结论:

  以独立语句将newed对象托管给只能指针。如果不这样做,一旦出现异常,就有可能导致难以察觉的资源泄漏。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: