Chinaunix首页 | 论坛 | 博客
  • 博客访问: 11581
  • 博文数量: 10
  • 博客积分: 420
  • 博客等级: 下士
  • 技术积分: 110
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-29 15:42
文章分类
文章存档

2010年(10)

我的朋友
最近访客

分类: C/C++

2010-09-09 01:05:08

QZone Editor

delete和delete[]的区别(在windows,VC6.0环境下得出的结论,其它环境未试过)

T* p = new T[n];

如果T类型有析构函数,则new 一个T类型的数组会多分配4个字节,用来存放数组个数,然后才分配数组的空间,分配好空间后,再调用n次T的构造函数对p+4+i*sizeof(T)(0<=i<=n)地址进行初始化,

调用delete[] p释放的时候先调用n个析构函数,不过和调用构造函数相反,析构是从数组最后一个开始,直到n=0,最后调用delete p释放内存。

如果调用delete p;则会调用数组第一个元素的析构函数,然后就调用delete p+sizeof(T)释放内存,因为动态分配的内存是从p位置开始的,delete p+sizeof(T)释放内存时会发生异常,假设没有发生异常,但这样只调用首个元素的析构函数,其它元素没有调用析构函数,这样不符合预期。

 

如果T类型没有析构函数则不用多分配4个字节,delete p和delete[] p效果一样。

注:C/C++基本数据类型是没有析构函数的。

阅读(498) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~