C++中一个delete的问题

// String 的析构函数
String::~String(void)
{
   delete [] m_data;
   // 由于m_data 是内部数据类型,也可以写成 delete m_data;
}

Q:上面的注释不太明白,为什么内部数据类型delete的时候就可以不加[]?

A1:你能深入思考这个问题,不简单啊。我的理解是这样的:
因为是内部数据的时候,编译器是可以识别的,即便是比如数组,编译器可以识别它是数组,如:char s[];当delete s;时,编译器读入s的地址,就可以判断它是数组类型---就像出入数组参数只需要传入数组名即可。数组名代表数组的开头地址,即数组的入口。数组是在内存表示上是一段连续内存,所以可以连续删除。当然用 delete[] s;更好,这样显式声明其为数组了。另一个原因是,对于内置数据类型delete的操作是已经定义好了,程序员不能再重新定义它了。而对于程序员自己定义的class来说,程序员可以自己去定义其行为。

但是,如果是其他类型,如:class C; C s1[];当delete s1;时,因为C不是内置数据类型,是程序员自己定义的类,所以,允许程序员自己定义delete操作。程序员类的delete重载操作符的是删除部分或全部。所以编译器就默认当是delete 一个类对象时,只析构第一个。如果要析构所有,必须添加[],即delete[]。

建议:对于数组来说,无论是内置类型或者是用户自定义类型,显示使用deletep[]可以增加程序的可读性

A2:因为内置的类型不需要调用析构函数, 而如果是复杂的,需要调用析构函数的类型,如果是数组用 delete m_data这类的用法,就会造成后面的元素的析构函数没被调用
无论如何应该分清楚 delete[] 和delete, 混淆这个有可能造成隐含的问题或者造成误解,却得不到任何好处, 所以写这注释的人就是胡扯。

A3:我的观点是,不管的build-in type, 还是ADT,只要是数组,统一用delete[]

LINK:原文链接

ps.C++中的delete在C中怎么表示原文链接

for(i=0;i<n;i++) 
 {
     delete []M[i];
  }
  delete []M;

这段代码 用C表示:

for(i=0;i<n;i++) 
 {
     free(M[i]);
  }
  free(M);


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值