【Effective C++读书笔记】篇七(条款16~条款17)
来源:互联网 发布:办公室自动化软件 编辑:程序博客网 时间:2024/05/17 02:37
条款16:成对使用 new 和 delete 时要采取相同形式
特别需要小心的如:
typedef int a[4];int *pi = new a; //new a得到的是一维指针 int *,而非 int(*)[],此处相当于 pi = new int[4];delete pi; //行为未定义delete[] pi; //正确,使用了匹配“数组形式”的 delete[]
请记住:如果你在 new 表达式中使用 [],必须在相应的 delete 表达式中也使用 []。如果你再 new 表达式中不使用 [],一定不要在相应的 delete 表达式中使用 []。
条款17:以独立语句将 newed 对象置入智能指针
主要原因如下:
fun(tr1::shared_ptr<Widget>(new Widget), process());
我们知道在执行 fun() 函数之前,需要先构造一个智能指针(分为两步:1、new Widget;2 、调用 tr1::shared_ptr 构造函数)以及执行函数 process()。
可是对于C++编译器来说,它会以什么样的次序来执呢?确定的是tr1::shared_ptr 构造函数一定是在 new Widget 之后执行的,可是 process() 的调用排在第一?第二?还是第三执行,我们并不能确定。由此引发如果 process() 在第二顺位执行且发生异常,注意此时 new Widget 执行完毕,但却还未来及将其放入智能指针中管理起来,导致在第二步异常发生时函数返回造成内存泄露。
为了避免这个问题,我们应该将tr1::shared_ptr<Widget>(new Widget)和process()两句分开调用:
tr1::shared_ptr<Widget> pw(new Widget);fun(pw, process());这样就不会发生之前的惨剧。
请记住:以独立语句将 newd 对象存储于智能指针内。如果不这样做,一旦异常被抛出,有可能导致难以觉察的资源泄露。
0 0
- 【Effective C++读书笔记】篇七(条款16~条款17)
- 【Effective C++】读书笔记 条款13~条款17
- 《Effective C++》资源管理:条款16-条款17
- 【Effective C++读书笔记】篇二(条款02~条款04)
- 【Effective C++读书笔记】篇三(条款05~条款06)
- 【Effective C++读书笔记】篇四(条款07~条款09)
- 【Effective C++读书笔记】篇五(条款10~条款12)
- 【Effective C++读书笔记】篇六(条款13~条款15)
- 【Effective C++读书笔记】篇八(条款18~条款21)
- 【Effective C++读书笔记】篇九(条款22~条款24)
- 【Effective C++读书笔记】篇十一(条款26~条款28)
- 【Effective C++读书笔记】篇十二(条款29~条款30)
- 【Effective C++读书笔记】篇十三(条款31~条款33)
- Effective C++(条款13-17)
- 【Effective C++】读书笔记 条款49~51
- Effective C++读书笔记(条款11-17)
- 【Effective C++读书笔记】篇一(导读~条款01)
- 【Effective C++读书笔记】篇十(条款25)
- c/c++使用指针做函数返回值和指针作函数参数问题
- 关于PHP+MSSQL查询输出的内容末尾乱码问题!
- Android 热补丁动态修复框架小结
- android - RadioButton椭圆形背景样式和字体选择时候的颜色
- 数据格式转换和数据格式扩展的区别与联系
- 【Effective C++读书笔记】篇七(条款16~条款17)
- Ribbon界面编辑框或下拉框使能问题
- Reverse String
- eclipse调整html字体详细步骤
- ACM4-1002
- iOS-OC-内购In-App Purchases
- Swift - 如何让UIView,UILabel和UIImageView之间类型互相转化
- maven工程spring3.x pom文件依赖配置
- maven项目导到eclipse不识别为java项目且认不到mave Dependencies