我们今天来学习C++中的 new 与 delete。

它们2个是C++中的关键字,作用是在free store(C语言中的堆区)中申请空间来存放数据。

C++中的 new 与 delete_new

存在的意义

为什么我们要在free store中去存放数据呢?

——因为free store中的生命周期是由我们程序员所控制的。

在某些时刻,我们只需要暂时性地使用一些数据。在这种情况下,如果我们把这些数据放在堆free store中,那么我们就可以在这些数据的使用结束后,立即释放这些空间,从而减去不必要的内存占用。


使用规则与实例

关键字 new 的代码示范:
#include <iostream>
using namespace std;

int main()
{
	//new 用法介绍:
	// 1.申请一个单位的空间:new 数据类型(初始化)
	// 2.申请多个单位的空间:new 数据类型[所需单位数量]
	// 3.返回值是地址,所以我们要使用指针来接收它
	//

	
	//示例:
	int *p = new int(8); //1.申请一个 int 的空间,且初始化为 8
	int *arr = new int[10];//使用 new 申请 10 个 int 的空间(数组)

	
	cout << *p << endl;//打印 *p 看看我们是否申请且初始化成功

	for (int i = 0; i < 10; i++)//打印 *p 看看我们是否申请且初始化成功
	{
		arr[i] = i;
		cout << arr[i] << " ";
	}

	return 0;
}

运行结果:

C++中的 new 与 delete_堆区_02


我们刚刚提到,free store 里的空间是由我们程序员来控制生死的,我们刚刚创建了它,那么问题来了:我们该如何销毁它,把空间还给计算机呢?

——使用关键字 delete


关键字 delete 的代码示范:
#include <iostream>
using namespace std;

int main()
{
	int *p = new int(8); 
	int *arr = new int[10];

	cout << *p << endl;

	for (int i = 0; i < 10; i++)
	{
		arr[i] = i;
		cout << arr[i] << " ";
	}


	//现在我们使用 delete 来销毁刚刚 new 的空间
	delete p;
	delete[] arr;

	//尝试再次输出
	cout << *p << endl;
	for (int i = 0; i < 10; i++)
	{
		arr[i] = i;
		cout << arr[i] << " ";
	}

	return 0;
}

运行结果:

C++中的 new 与 delete_堆区_03

我们可以看到,编译器报错了。这是因为当 delete 掉刚刚 new 所申请的空间后,就无法访问该空间了。也就是说,我们已经成功把刚刚所申请的空间还给了操作系统。