分类: C/C++
2010-09-09 01:05:08
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++基本数据类型是没有析构函数的。