delete 和delete []的区别
int* a = new int[10]
- 针对简单类型,使用new分配内存之后不管是数组还是非数组形式内存空间用两种方式都可以。
delete a
和delete []a
的释放效果相同。在简单类型分配内存时,内存的大小已经确定,系统可以记忆并且进行管理。在析构时,系统并不会调用析构函数。可以通过指针获取实际分配的内存空间。 - 对于类类型,两种方式有不同的差异。
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指针指向的全部内存空间。
简单总结
delete ptr
代表释放内存,且只用来释放ptr指向的内存。delete [] ptr
用来释放ptr指向的内存,而且逐一调用数组中每个对象的destructor。- 对于像
int/char/long/int*/struct
等等简单数据类型,由于对象没有destructor,所以用delete 和delete [] 是一样的,但是如果是C++对象数组就不同了!