读书笔记《Effective c++》 条款17 以独立语句将newed对象置入智能指针
2018-01-09 19:59
295 查看
假设有一个函数:
调用的时候可能会这么写:
在调用processWidget之前,编译器必须创建代码,做以下三件事:
1.调用priority()
2.执行“new Widget”
3.调用std::shared_ptr构造函数
但是c++编译器可能会对这三件事的顺序隐藏地做出调整,最终的顺序可能是
2->1->3
这样就有一个问题,如果priority()函数出了异常,那么将会导致new Widget执行了,但没有托管给shared_ptr,这样就会有资源泄漏。
避免这个问题很简单,使用分离语句:
因为编译器对于“跨语句的各项操作”没有重新排列的自由,只有在语句内它才拥有那个自由度。
结论:
以独立语句将newed对象托管给只能指针。如果不这样做,一旦出现异常,就有可能导致难以察觉的资源泄漏。
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对象托管给只能指针。如果不这样做,一旦出现异常,就有可能导致难以察觉的资源泄漏。
相关文章推荐
- 读书笔记《Effective C++》条款17:以独立语句将newed对象置入智能指针
- effective C++ 读书笔记 条款17 以独立语句讲newed对象置入智能指针
- Effective C++ 条款17 以独立语句将newed对象置入智能指针
- Effective C++:条款17:以独立语句将newed对象置入智能指针
- effective C++ 条款 17:以独立语句将newed对象置入智能指针
- Effective C++ 条款17 以独立语句将newed对象置入智能指针
- Effective C++ -----条款17:以独立语句将newed对象置入智能指针
- 《Effective C++》——条款17:以独立语句将newed对象置入智能指针
- 《Effective C++》学习笔记条款17 以独立语句将newed对象置入智能指针
- effective c++ 条款17 :以独立语句将newed 对象置入智能指针
- Effective C++(17) 以独立语句将newed对象置入智能指针
- 条款17:以独立语句将newed对象置入智能指针
- Effective C++ 学记之17 以独立语句将newed对象置入智能指针
- 条款17:以独立语句将newed对象置入智能指针
- 条款17:以独立语句将newed对象置入智能指针
- C++之以独立语句将newed对象置入智能指针(17)---《Effective C++》
- 条款17:以独立语句将newed对象置入智能指针
- 条款17:以独立语句将newed对象置入智能指针
- 条款17:以独立语句将newed对象置入智能指针
- 条款17以独立语句将newed对象置入智能指针