对于计算机程序设计而言,变量和对象在内存中的分配都是编译器在编译程序时安排好的,这带来了极大的不便,如数组必须大开小用,指针必须指向一个已经存在的变量或对象。对于不能确定需要占用多少内存的情况,动态内存分配解决了这个问题。
new和delete运算符是用于动态分配和清理开辟的内存的运算符。
一、我们现在想开辟用来存放 int 型数据的内存,在c++中可以这样定义:
int* p = new int;
new 运算符是根据类型来确定需要多少字节的内存,然后找到长度合适的内存块,并返回其地址。而p 被声明为指向 int 的指针,正好用来接收 new 返回的地址。因为还未对该块内存进行初始化,所以此时的值是无效值,我们要对其进行赋值。用 new 为简单的类型分配内存时,首先需要指定需要分配的数据类型, 并返回该内存块的地址。而我们需要做的就是把该地址赋给一个对应类型的指针。
我们还可以用 new 来创建常量内存块:
const int* pc = new const int (10);
因为我们开辟的是常量内存块,所以指针必须是 const 类型的,创建常量内存块的同时必须进行初始化,不然这块内存的值以后无法进行修改
二、用 new 创建动态数组
1、一维数组的创建
在C++中,创建动态数组很容易, 例如,要创建一个包含 10 个 int 元素的数组,可以这样做:
int *a = new int[5];
为数组分配内存的通用格式如下:
typeName* pointer_name = new typeName [num_elements];
类型* 指针名 = new 类型 [元素个数];
我们是也可以在数组分配内存的同时初始化这个数组,但是只能把该数组的所有元素都初始化为 0 。
例如: int* p_arr = new int[10]();
2、创建二维数组
int** p = new (int*)[5];
for(int i = 0;i < 5 i++)
{
p[i] = new int [5];
}
三、Delete:当 new 是为简单类型分配内存后,之后使用 delete 时清理new开辟的空间时,只需要在后面加上指向内存块的指针;一定要配对的使用 new 和 delete ,否则将发生内存泄漏。当然不能使用 delete 释放不是 new 分配的内存
1.删除单变量地址空间
例如: delete p;(上边的例子)
2.释放开辟的一维数组,如果使用 new[ ] 为数组分配内存,则应使用 delete[ ] 来释放:
delete []a;
注意事项:如果使用 new 时不带中括号,则使用 delete 时也不带中括号。如果使用 new 时带中括号,则使用 delete 时也带中括号。 当new 和 delete 的格式不匹配导致的后果是不确定的。如下面的例子
delete [ ] pt;
int* ps = new int [ 5];
delete ps;
3.释放二维数组
for(int i = 0; I < 5; i++)
{
delete [ ] p[i];
}
delete [ ] p;