Effective C++——》条款17:以独立语句将newed的对象置入智能指针
2014-04-12 07:29
369 查看
举书上的例子:
如果这样调用processWidget:
注意一下两边的类型,定义是管理者shared_ptr<Widget>类,而调用是被管理者Widget类,两个类型不等,编译器会试图执行类型隐式转换,但为了安全起见,shared_ptr的构造函数前面有修饰符explicit,它不允许发生隐式转换,所以编译器会报错。
但如果这样:
就可以成功调用构造函数了。
但这里可能会发生内存泄露,不知道读者有没有发现。千万不要认为GetPriority()是个配角,它的存在恰好是我们下面要讨论的。
函数参数压栈的顺序与编译器有关,这里的实参到形参的传递过程其实是不确定的,即GetPriority()的调用很可能发生在new Widget之后,而在pw(new Widget)之前,这样万一GetPriority抛出了异常,而pw还没有来得及接管new
Widget,这样就没有可能释放Widget资源了。也就是说,如果是按这个顺序执行的话:
(1) new Widget
(2) GetPriority() 并将返回值传给priority)(可能发生异常)
(3) pw接管newWidget,而后传给函数形参
就可能出现内存泄露。
那么怎样解决这个问题呢?
答案就是读书笔记的标题了:以独立语句将new产生的对象置入智能指针(因为“在资源被创建和资源被管理这两个时间点之间有可能发生异常干扰)。简言之,就是一条语句不要执行太多的操作,特别是这种内存管理的操作,分成几条独立的语句会安全一些。应该这样:
这样不管函数是以怎样的顺序传参,在第一句的时候就保证了资源的成功接管,即使GetPriority()发生异常,shared_ptr也能及时释放掉资源,从而避免内存泄露。
最后总结一下:
以独立语句将new出来的对象存储于(置入)智能指针内。如果不这样做,一旦异常被抛出,有可能导致难以察觉的资源泄漏。
1 int GetPriority(); 2 void processWidget(shared_ptr<Widget> pw, int priority);
如果这样调用processWidget:
processWidget(new Widget(), GetPriority());
注意一下两边的类型,定义是管理者shared_ptr<Widget>类,而调用是被管理者Widget类,两个类型不等,编译器会试图执行类型隐式转换,但为了安全起见,shared_ptr的构造函数前面有修饰符explicit,它不允许发生隐式转换,所以编译器会报错。
但如果这样:
processWidget(shared_ptr<Widget> pw(new Widget), GetPriority());
就可以成功调用构造函数了。
但这里可能会发生内存泄露,不知道读者有没有发现。千万不要认为GetPriority()是个配角,它的存在恰好是我们下面要讨论的。
函数参数压栈的顺序与编译器有关,这里的实参到形参的传递过程其实是不确定的,即GetPriority()的调用很可能发生在new Widget之后,而在pw(new Widget)之前,这样万一GetPriority抛出了异常,而pw还没有来得及接管new
Widget,这样就没有可能释放Widget资源了。也就是说,如果是按这个顺序执行的话:
(1) new Widget
(2) GetPriority() 并将返回值传给priority)(可能发生异常)
(3) pw接管newWidget,而后传给函数形参
就可能出现内存泄露。
那么怎样解决这个问题呢?
答案就是读书笔记的标题了:以独立语句将new产生的对象置入智能指针(因为“在资源被创建和资源被管理这两个时间点之间有可能发生异常干扰)。简言之,就是一条语句不要执行太多的操作,特别是这种内存管理的操作,分成几条独立的语句会安全一些。应该这样:
1 shared_ptr<Widget> pw(new Widget); 2 processWidget(pw, GetPriority());
这样不管函数是以怎样的顺序传参,在第一句的时候就保证了资源的成功接管,即使GetPriority()发生异常,shared_ptr也能及时释放掉资源,从而避免内存泄露。
最后总结一下:
以独立语句将new出来的对象存储于(置入)智能指针内。如果不这样做,一旦异常被抛出,有可能导致难以察觉的资源泄漏。
相关文章推荐
- Effective C++ Item 17 以独立语句将newed对象置入智能指针
- 条款17:以独立语句将newed对象置入智能指针
- 条款17:以独立语句将newed对象置入智能指针
- 条款17:以独立语句将newed对象置入智能指针
- 条款17 以独立的语句将newed对象置入智能指针
- Effective C++ 条款17 以独立语句将newed对象置入智能指针
- 读书笔记《Effective C++》条款17:以独立语句将newed对象置入智能指针
- 读书笔记_Effective_C++_条款十七:以独立语句将new产生的对象置入智能指针
- effective c++ 条款17 :以独立语句将newed 对象置入智能指针
- 《Effective C++》学习笔记条款17 以独立语句将newed对象置入智能指针
- 条款17:以独立语句将newed对象置入智能指针
- 条款17:以独立语句将newed对象置入智能指针(Store newed objects in smart pointers in standalone statements)
- Effective C++ 条款17 以独立语句将newed对象置入智能指针
- C++之以独立语句将newed对象置入智能指针(17)---《Effective C++》
- 条款17:以独立语句将NEWED对象置入智能指针
- 条款17:以独立语句将newed对象置入智能指针
- 条款17:以独立语句将newed对象置入智能指针
- 条款17以独立语句将newed对象置入智能指针
- Effective C++:条款17:以独立语句将newed对象置入智能指针
- 条款17:以独立语句将newed的对象置入智能指针