Item 16:为什么要使用同样的形式来new和delete Effective C++笔记
2015-08-28 11:58
555 查看
Item 16: Use the same form in correspoinding uses of new and delete.
这是C++界中家喻户晓的规则:如果你用
不必多说了,来个例子吧:
输出是:
如果
因为
即使是基本数据类型,错误的调用也会导致未定义行为。
不过在Homebrew gcc 5.1.0中,在
但是用
不管怎样,只需要记住用使用同样的形式来new和delete就好了。唯一的问题在于:
注意!此时用
问题在于
等号右边:
等号左边:
最终的解决办法还是避免使用
除非注明,本博客文章均为原创,转载请以链接形式标明本文地址: http://harttle.com/2015/08/07/effective-cpp-16.html
这是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
相关文章推荐
- 详解C语言中getgid()函数和getegid()函数的区别
- vector的成员函数解析
- C++之static
- C语言中fgetgrent()函数和fgetpwent()函数的用法对比
- 二进制文件与文本文件
- c语言函数--stat、isspace
- Windows上C++连接MySql的问题
- C++中函数模板的使用
- c++中的quick_sort
- C++中不能声明为虚函数的有哪些函数
- C++将string转化为int或者double
- c语言中常量的定义(备忘录)
- C++11 多线程2——Mutex的错误使用
- C语言中操作密码文件的一些函数总结
- c++中的rand函数
- C++类库:OTL连接MySQL ODBC数据库(insert, update, select)
- C++中的作用域与生命周期
- C++中的作用域与生命周期
- C++ DEFINE
- 详解C语言的exp()函数和ldexp()函数以及frexp()函数