Item 16:为什么要使用同样的形式来new和delete Effective C++笔记
来源:互联网 发布:软件开发教程视频 编辑:程序博客网 时间:2024/05/29 11:09
Item 16: Use the same form in correspoinding uses of new and delete.
这是C++界中家喻户晓的规则:如果你用new
申请了内存,请用delete
来销毁;如果你用new xx[]
申请了内存,请用delete[]
来销毁。 不必多说了,来个例子吧:
int* p = new int[2]{11, 22};printf("%d, %d", *p, *(p+1));delete[] p;
输出是:
11, 22
如果delete
的形式不同于new
,则会产生未定义的行为。 因为delete
需要调用相应的构造函数,所以它需要知道被删除的是数组还是单个对象。 即使是基本数据类型,错误的调用也会导致未定义行为。
不过在Homebrew gcc 5.1.0中,在int
数组上调用delete
不会引发严重后果。只是后面的内存未被释放而已。 但是用delete
来删除string
数组,会有如下错误:
malloc: *** error for object 0x7fcd93c04b38: pointer being freed was not allocated
不管怎样,只需要记住用使用同样的形式来new和delete就好了。唯一的问题在于:typedef
。请看例子:
typedef string address[4]; // 每个地址是四个字符串string* addr = new address;delete[] addr;
注意!此时用new
来申请空间,却需要使用delete[]
来释放。可能你会想这样写:
address* addr = new address;delete addr;
问题在于addr
的初始化语句中,等号两边的类型不兼容:
- 等号右边:
new address
的返回值与new string[4]
具有同样的类型:string*
。 - 等号左边:
addr
的类型是数组指针:string (*)[4]
。关于数组指针可参考:C++手稿:指针与引用
最终的解决办法还是避免使用typedef
来定义数组,你可以使用更加面向对象的vector
、string
等对象。
除非注明,本博客文章均为原创,转载请以链接形式标明本文地址: http://harttle.com/2015/08/07/effective-cpp-16.html
0 0
- Item 16:为什么要使用同样的形式来new和delete Effective C++笔记
- [翻译] Effective C++, 3rd Edition, Item 16: 成对使用的 new 和 delete 要使用相同的形式
- 《Effective C++》学习笔记条款16 成对使用new和delete时要采取相同形式
- 读书笔记 effective c++ Item 16 成对使用new和delete时要用相同的形式
- 读书笔记 effective c++ Item 16 成对使用new和delete时要用相同的形式
- 读书笔记 effective c++ Item 16 成对使用new和delete时要用相同的形式
- 读书笔记 effective c++ Item 16 成对使用new和delete时要用相同的形式
- 读书笔记 effective c++ Item 16 成对使用new和delete时要用相同的形式
- 读书笔记 effective c++ Item 16 成对使用new和delete时要用相同的形式
- 读书笔记 effective c++ Item 16 成对使用new和delete时要用相同的形式
- 读书笔记 effective c++ Item 16 成对使用new和delete时要用相同的形式
- Effective C++ Item 16 成对使用new和delete时要采取相同形式
- Effective C++ Item 16-成对使用new和delete时要采取相同形式
- Effective C++(16) 成对使用new和delete时要采取相同的形式
- C++之成对使用的new和delete时采取相同形式(16)---《Effective C++》
- Effective C++:条款16:成对使用new和delete时要采取相同形式
- 读书笔记《Effective C++》条款16:成对使用new和delete时要采取相同形式
- Effective c++ 条款16学习笔记: 成对使用new和delete时要采取相同形式
- Android AsyncTask源码解析
- 宏与函数的不同
- J2EE-BaseService.java
- Struts(4)开发实例
- STL源码剖析 [容器](二)
- Item 16:为什么要使用同样的形式来new和delete Effective C++笔记
- R learning - date and time
- jsp过滤器
- Service与多个Activity交互
- InputStreamReader 和FileReader的区别
- 【解决】SSH问题(四)Java.Lang.ClassNotFoundException: Org.Springframework.Transaction.TransactionException
- cocos2d-X
- 类选择器
- AutoMapper:Missing type map configuration or unsupported mapping