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);
- C++中一个delete的问题
- 关于对象在函数中delete的一个问题
- mysql delete的一个问题
- Qt中delete的问题
- Qt中delete的问题
- C语言中delete与delete []的不同
- Oracle中,一个Delete操作的流程
- Oracle中,一个Delete操作的流程
- c++中new和delete,delete[]的匹配问题(转载)
- C++中delete崩溃的问题
- mysql中delete的语法别名问题
- mysql中delete的语法别名问题
- 解决link_to 中delete无效的问题
- C++中delete问题
- C++中delete问题
- 一个关于c++字符串处理和delete[]与delete差别的问题
- c中字符串的读取的一个问题
- C ++的new、delete
- Mr. Process的一生-Linux内核的社会视角 (1)调度
- struts1.2 struts-config.xml配置
- WebView实现文件下载功能
- 设计模式观后(c++还原之六 虚拟工厂)
- cocos2d-x 精灵遮罩
- C++中一个delete的问题
- 经典Ios 参考资料总结大全
- AFnetworking监测网络变化
- 条件运算符嵌套问题:成绩评级
- 具有先天开源优势的Web前端技术社区里也是波澜不惊
- sparkSQL1.1入门之五:测试环境之搭建
- 编程细节的考虑——卓越的教练是如何训练高手的?
- Cocos2d-X 中TableView的用法
- struts导入Excel进行解析