条款16:成对使用new和delete时要采取相同形式

//错误的示例:
std::string stringArray = new std::string[100];
...

delete stringArray;


当你使用new,有两件事发生。

第一,内存被分配出来(通过名为operator new的函数)

第二,针对此内存会有一个(或更多)构造函数被调用。

当你使用delete,也有两件事发生:

针对此内存会有一个(或更多)析构函数被调用

内存被释放(通过operator delete)

delete的最大问题:即将被删除的内存之内究竟有多少个对象?这个问题的答案决定了有多少个析构函数被调用

问题可以简化为:即将被删除的那个指针,所指的是单一对象还是对象数组?

如果你使用delete时加上中括号,delete便认定指针指向一个数组,否则认定指针指向单一对象
std::string* stringPtr1 = new std::string;
std::string* stringPtr2 = new std::string[100];
...
delete stringPtr1; //删除一个对象
delete [] stringPtr2; //删除一个由对象组成的数组

规则很简单: 如果你调用new时使用[],你必须在对应调用delete时使用[],如果你调用new时没有使用[],也不该在对应调用delete时使用[].

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值