优秀的编程知识分享平台

网站首页 > 技术文章 正文

c++ delete与delete[]的区别

nanyue 2024-12-06 17:59:45 技术文章 8 ℃

记得有次面试被问到了delete与delete[]的区别?当时回答的也不好下面来总结下它们的区别。c++告诉我们在回收用new分配的单个对象的内存空间的时候用delete,回收用new[]分配的一组对象的内存空间的时候用delete[]。


关于new[]和delete[]其中又分为两种情况:

1.为基本数据类型分配和回收空间。

2.为自定义类型分配和回收空间。


下面看程序

#include<iostream>
using 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;
}


大家可以自己运行这个程序,看一看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[]可以看出释放对象数组时,调用了三次析构函数。

最近发表
标签列表