C++中一个delete的问题

来源:互联网 发布:apache maven安装 编辑:程序博客网 时间:2024/09/21 09:17
// 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);


0 0