C++中一个delete的问题
2014-09-10 08:43
246 查看
// 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);
相关文章推荐
- 一个关于c++字符串处理和delete[]与delete差别的问题
- 一个小问题,c++
- 一个C++语法问题。
- 为一个朋友解答的C++小问题
- 这些天很忙,写一个类似防火墙的东西在WINSOCK2 SPI上做DLL,终于把问题解决了,现提供完整C++项目下载
- 一个IQ问题的C++模拟
- 一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 用C++/lua/python/bash的四重实现(3) 最大子序列和问题
- 设计模式---单件(C++版) 一个简单实例(避免用户忘记delete单件实例)
- 求教一个c++异常问题
- 关于rand()的函数: 请问一个关于C++的问题...
- 在C++的虚继承中要注意的一个传值问题
- 一个C++学习者的问题
- [初]一个C++关于string的小问题
- 一个C++模板的问题,VC6.0通过, GCC不能通过!!
- 从易到难编写C++程序,(4)问题:实现一个大整数表示的BigInt类
- 一个公司的C/C++程序员面试问题
- thinking in c++ 读书笔记---友元函数的一个问题
- zz一个VS2005无法调试C++的问题
- C++使用出问题,菜鸟一个,不知怎么解决,郁闷
- 一个C++小问题