免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 13243 | 回复: 25
打印 上一主题 下一主题

求问delete和delete[] 的区别?? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-04-23 11:13 |只看该作者 |倒序浏览
测了一下,好像没有区别,又想不起在什么地方能用到delete[],大家评论一下。

#include <iostream>;
#include "xercesc/dom/DOM.hpp"
int main(){

        char* pc = 0;
        char* pc2;
        int i = 21;
        pc = new char;
        std::cout<<(long)pc<<std::endl;
        delete pc;
        std::cout<<(long)pc<<std::endl;

        pc2 = new char;
        std::cout<<(long)pc2<<std::endl;

        return 0;
}

输出:
[root@ts xml]# ./a.out
134519536
134519536
134519536

地址没有变化,用delete[], delete都一样

论坛徽章:
0
2 [报告]
发表于 2004-04-23 12:08 |只看该作者

求问delete和delete[] 的区别??

C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[]。

楼主的这个问题提得很好。很多人注意到了这个问题,但是却不清楚为什么要这样做,不这样做行不行。

关于 new[] 和 delete[],其中又分为两种情况:(1) 为基本数据类型分配和回收空间;(2) 为自定义类型分配和回收空间。

对于 (1),上面提供的程序已经证明了 delete[] 和 delete 是等同的。但是对于 (2),情况就发生了变化。请看下面的程序。
  1. #include <iostream>;
  2. using namespace std;

  3. class T {
  4. public:
  5.   T() { cout << "constructor" << endl; }
  6.   ~T() { cout << "destructor" << endl; }
  7. };

  8. int main()
  9. {
  10.   const int NUM = 3;

  11.   T* p1 = new T[NUM];
  12.   cout << hex << p1 << endl;
  13.   //  delete[] p1;
  14.   delete p1;

  15.   T* p2 = new T[NUM];
  16.   cout << p2 << endl;
  17.   delete[] p2;
  18. }
复制代码


大家可以自己运行这个程序,看一看 delete p1 和 delete[] p1 的不同结果,我就不在这里贴运行结果了。

从运行结果中我们可以看出,delete p1 在回收空间的过程中,只有 p1[0] 这个对象调用了析构函数,其它对象如 p1[1]、p1[2] 等都没有调用自身的析构函数,这就是问题的症结所在。如果用 delete[],则在回收空间之前所有对象都会首先调用自己的析构函数。

基本类型的对象没有析构函数,所以回收基本类型组成的数组空间用 delete 和 delete[] 都是应该可以的;但是对于类对象数组,只能用 delete[]。对于 new 的单个对象,只能用 delete 不能用 delete[] 回收空间。

所以一个简单的使用原则就是:new 和 delete、new[] 和 delete[] 对应使用。

评分

参与人数 1可用积分 +1 收起 理由
toniz + 1

查看全部评分

论坛徽章:
0
3 [报告]
发表于 2004-04-23 15:12 |只看该作者

求问delete和delete[] 的区别??

感谢解释,又解决了一个疑问,呵呵

论坛徽章:
0
4 [报告]
发表于 2004-04-26 09:38 |只看该作者

求问delete和delete[] 的区别??

thanks,我应该多试试的

论坛徽章:
0
5 [报告]
发表于 2004-04-26 10:14 |只看该作者

求问delete和delete[] 的区别??

好贴,收藏

论坛徽章:
0
6 [报告]
发表于 2004-04-26 12:27 |只看该作者

求问delete和delete[] 的区别??

好贴

论坛徽章:
0
7 [报告]
发表于 2004-04-26 17:54 |只看该作者

求问delete和delete[] 的区别??

whyglinux ,基础理论很强吗。
刚想回答,被你抢了!! 迷死你了!!!!!!

论坛徽章:
0
8 [报告]
发表于 2004-04-27 09:44 |只看该作者

求问delete和delete[] 的区别??

经典,顶一下。

论坛徽章:
0
9 [报告]
发表于 2004-05-02 17:50 |只看该作者

求问delete和delete[] 的区别??

支持一下

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
10 [报告]
发表于 2004-05-02 18:38 |只看该作者

求问delete和delete[] 的区别??

我想问一下楼主说地址都一样和这里的delete(delete[])有关系吗?
还有它这里为什么地址会一样呢?不是两个new吗?怎么会new到一起去了呀?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP