记得有次面试被问到了delete与delete[]的区别?当时回答的也不好下面来总结下它们的区别。c++告诉我们在回收用new分配的单个对象的内存空间的时候用delete,回收用new[]分配的一组对象的内存空间的时候用delete[]。
关于new[]和delete[]其中又分为两种情况:
1.为基本数据类型分配和回收空间。
2.为自定义类型分配和回收空间。
下面看程序
#includeusing namespace std;class T{public:T() { cout << "T 构造函数" << endl; }~T() { cout << "T 析构函数" << endl; }};int main(){const int NUM = 3;T* p1 = new T[NUM];cout << hex << p1 << endl;delete p1;T* p2 = new T[NUM];cout << p2 << endl;delete[] p2;return 0;}
![c8a933f15257964b31eb7b1de8a3188d.png](https://img-blog.csdnimg.cn/img_convert/c8a933f15257964b31eb7b1de8a3188d.png)
大家可以自己运行这个程序,看一看delete p1与delete [] p1的不同结果。
1.从运行结果中我们可以看出,delete p1在回收空间的过程中,只有p1[0]这个对象调用了析构函数,其它对象如p1[1] p1[2]等都没有调用自身的析构函数,这就是问题的本质所在,如果用delete []则在回收空间之前,所有对象都会首先调用自己的析构函数。
2.基本类型的对象没有析构函数,所以回收基本类型组成的数组空间用delete和delete[]都是应该可以的,但是对于类对象数组,只能用delete[], 对于new的单个对象只能用delete不能用delete []回收空间。
3.所以一个简单的使用规则是:new和delete new[]与delete[]对应使用
4.可以看出如果只是使用了delete来进行释放对象数组,则会出现进程异常且析构函数只调用了一次。
5.如果换成delete[]可以看出释放对象数组时,调用了三次析构函数。