delete一共干两件事:
1)释放内存
2)执行析构函数
就释放内存来说,编译器是根据你这个指针的地址来知道这块内存的大小的,因为你申请的时候,内存管理器记录了这个地址开始的申请的内存的大小。 所以不管是啥,内置类型(int),自定义类型还是一个xx数组,delete和delete[ ]都释放了内存(把内存标记为未使用)。
但是对第二件事——执行析构函数而言,两者是不同的,delete只会执行一次析构函数,而delete[ ]会找到数组维度n,从数组尾到数组头依次执行析构函数。所以对于那些trivial 析构而言的数组(包括但不限于 int * a =new int[10]),delete和delete [ ] 没有区别,但是对于那些有用的析构,(类使用了某些需要释放的资源) 就不一样了。
比如下面这个
class A
{
private:
char *m_cBuffer;
int m_nLen;
public:
A(){ m_cBuffer = new char[m_nLen]; }
~A() { delete [] m_cBuffer; }
};
A *a = new A[10];
delete a; //仅释放了a指针指向的全部内存空间 但是只调用了a[0]对象的析构函数 剩下的从a[1]到a[9]这9个用户自行分配的m_cBuffer对应内存空间将不能释放 从而造成内存泄漏
delete [] a; //调用使用类对象的析构函数释放用户自己分配内存空间并且 释放了a指针指向的全部内存空间