Item 16:为什么要使用同样的形式来new和delete Effective C++笔记

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来定义数组,你可以使用更加面向对象的vectorstring等对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值