读书笔记_Effective_C++_条款十六:成对使用new和delete时要采取相同的形式

这个条款比较好理解,就是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表达式中使用[]。

转载于:https://www.cnblogs.com/jerry19880126/archive/2013/05/26/3100190.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值