### new 和 delete 运算符

对于 C++应用程序来说，数据主要有两种存储方式，一种是栈存储方式，一种是堆存储方式。栈存储通常用于存储占用空间小，生命周期短的数据。例如，局部变量和函数参数等。堆存储通常用于存储占用空间大、生命周期长的数据。例如，静态变量和全局变量等。除了静态变量和全局变量，用户可以使用 new 运算符在堆中开辟一个空间，使变量存储在堆中。例如：

int *pData = new int; //定义一个整型指针，使用 new 运算符在堆中开辟空间

*pData = 100; //为指针在堆中的数据赋值

…… //使用 pData 进行其他操作

delete pData; //释放 pData 在堆中占用的空间

当我们在程序中使用 new 运算符在堆中开辟一个空间之后，在数据使用完后，一定要释放在堆中开辟的空间，否则会出现内存泄露。运算符 delete 用于释放 new 运算符在堆中开辟的空间。例如，上面代码中“delete pData;”语句用于释放 pData 在堆中占用的空间。

对于简单的数据类型，使用 new 运算符在堆中分配空间时，可以对其进行初始化。例如：

int *pData = new int(100); //pData 所指向的数据为 100

使用 new 运算符不仅可以为简单的对象分配空间，还可以为数组对象在堆中开辟空间。例如，下面的语句在堆中为数组开辟空间。

int *pData = new int[3]; //在堆中为数组分配空间

pData[0] = 2; //访问数组中的第一个元素

pData[1] = 5; //访问数组中的第 2 个元素

pData[2] = 6; //访问数组中的第 3 个元素

对于使用 new 运算符为数组分配空间时，不能够为数组进行初始化，除非变量是一个类对象，并且对象的类型（类）提供了默认的构造函数。此外，在释放使用 new 运算符为数组分配的空间时，需要使用 delete []来释放。例如：

delete [] pData; //释放在堆中分配的数组空间

在上面的代码中，如果使用“delete pData;”来释放 pData 指针指向的数组空间，也是可以的，不会出现内存泄露。但是，在编写代码时，并不提倡这么做。因为，对于简单的基础数据类型（上述代码为 int 类型），没有提供析构函数，使用“delete pData;”语句释放数组时不会出现内存泄露，但是对于类对象数组来说，这样做通常是不行的，如果类中包含有在堆中分配数据成员，必须使用“delete []”形式来释放 new 运算符分配的数组空间，否则将导致内存泄露。

当我们在程序中使用 new 运算符在堆中分配空间时，注意不要轻易修改指针指向的地址。例如：

int *pData = new int[3]; //在堆中分配一个数组空间

int nLen = 10; //定义一个整型变量

pData = &nLen; //为指针 pData 赋值

在上述代码中，指针 pData 最初指向堆中的一个地址空间，然后将其指向了整型变量 nLen，这样将导致 new 运算符在堆中开辟的空间无法被释放，最终会导致内存泄露，这是所不允许的。

注意：当前指针指向了堆空间的地址，如果将其再指向其他地址，将导致无法释放堆空间。