Effective C++——》条款16:成对使用new和delete时要采取相同的形式
来源:互联网 发布:淘宝联盟如何省钱 编辑:程序博客网 时间:2024/05/17 17:44
这个条款比较好理解,就是new有两种形式:
1 int *p = new int(); // 申请一个int资源2 int *p = new int[3]; // 申请连续三块int资源
而delete也有两种资源:
1 delete p; // delete指针所指向的单一资源2 delete [] p; // delete指针所指向的多个连续资源块
那么该各用哪一种形式呢?一个简单又好记的规则就是:
在new如果使用了[],那么delete也去用[];反之则都不用。一句话,都用或者都不用。
但事实上,如果用错了,编译器不会给任何提示,也没有运行错(VS2008环境),这些行为是“未定义的”。这可能会产生严重的后果,因为这会造成内存回收不彻底的bug。
上面是一种直观的形式,如果换成稍稍复杂一些,比如:
1 typedef string AddressLines[4];2 string *pal = new AddressLines;
那么该用delete pal还是delete []pal呢?
注意这里用了typedef,AddressLines是相当于string[4],pal指向4个连续string内存段的首地址,所以这里应该用delete[] pal。
这样看来,与我们之前说的简记规则又矛盾了,因为new的时候并没有出现[],而delete却有了[]。
书上对此作了解释,“最好尽量不要对数组形式做typedef动作”,应该用C++标准程序库中的类似vector<string>来做,这样就可以避免出错了。
总结一下:
如果你在new表达式中使用[],必须在相应的delete表达式中也使用[]。如果你在new表达式中不使用[],一定不要在相应的delete表达式中使用[]。
0 0
- Effective C++——》条款16:成对使用new和delete时要采取相同的形式
- 《Effective C++》学习笔记条款16 成对使用new和delete时要采取相同形式
- Effective C++:条款16:成对使用new和delete时要采取相同形式
- 读书笔记《Effective C++》条款16:成对使用new和delete时要采取相同形式
- Effective c++ 条款16学习笔记: 成对使用new和delete时要采取相同形式
- Effective C++ 读书笔记 条款16:成对使用new和delete时要采取相同形式
- Effective C++条款16解读:成对使用new和delete时要采取相同形式
- Effective C++条款16:成对使用new和delete时要采取相同形式
- Effective C++(16) 成对使用new和delete时要采取相同的形式
- 《Effect C++》学习------条款16:成对使用new和delete时要采取相同形式
- C++之成对使用的new和delete时采取相同形式(16)---《Effective C++》
- 条款16:成对使用new和delete时要采取相同的形式
- 条款16:成对使用new和delete时要采取相同的形式
- 条款16:成对使用new和delete的时候要采取相同形式
- 条款16:成对使用new和delete时要采取相同形式
- 条款16:成对使用new和delete时要采取相同形式
- 条款16:成对使用new和delete时要采取相同形式
- 条款16 成对使用new和delete时要采取相同形式
- MySQL 中LIMIT用法
- CMD登录MYSQL操作步骤
- MySQL常用函数
- (一) MySQL 查询分析
- Java WEB安全问题及解决方案
- Effective C++——》条款16:成对使用new和delete时要采取相同的形式
- (二) Schema设计优化 与 数据类型优化
- (三)创建高性能的索引
- (四)查询性能优化
- (五)MySQL的高级特性
- MySql中delimiter的作用是什么?
- Effective C++——》条款17:以独立语句将newed的对象置入智能指针
- 给Jquery添加alert,prompt方法,类似系统的Alert,Prompt,可以响应键盘,支持拖动
- Oracle索引之索引组织表(IOT)