在C语言中使用malloc()函数申请堆内存,然后用free()释放这块内存。而C++提供了简便且功能较强的运算符new和delete来进行内存的分配和释放,以下简单介绍new操作符的用法
1.new与单个元素
(1)
int* p=new int;
new返回指向int类型的指针,并且没有对申请的空间进行初始化,此时p指向一个随机值
(2)
int* p=new int();
类型后面加空括号,系统默认初始化,例如此处申请到的空间被初始化为0,如果是char类型,将被初始化为NULL
(3)
int* p=new int(5);
括号里是自己提供的初值
释放内存:
delete p; p=NULL;
切记,new申请的堆内存在用完后必须用delete释放,否则造成内存泄露
2.new与一维数组
创建的数组长度为5
(1)
int* p=new int[5];
new返回数组首地址,没有初始化
(2)
int* p=new int[5]();
默认初始化
!!new为数组申请内存时无法提供初值
int* p=new int[5](0); int* p=new int[5](3); //会造成语法错误
释放内存:delete []p;
p=NULL;
3.new与二维数组
例如,我们要创建一个[row][col]的二维数组
(1)
int** q=new int*[row]; for(int i=0;i<row;i++){ q[i]=new int[col]; }
使用二级指针,先创建一个指向指针数组的指针变量,然后让指针数组的每个元素指向一个数组(也就是二维数组的每一行);
释放内存:须一级一级地释放,并且先释放数组的第row行,
if(q){ for(int i=0;i<row;i++){ delete []q[i]; delete []q; cell=NULL; } }
注意:连续两次delete同一个指针会造成严重错误 ,
为什么?当程序员用new申请一块堆内存时,计算机就把对这块内存的使用权限交给程序员,并且不会让其他程序占用这块内存;当第一次delete就把这块内存还给了机器,如果再次delete就相当于拿机器的内存还给机器,可能破坏正在使用这块内存的程序中的数据。
(2)
char(*p)[3]=new char[5][3];
把char[3]看成一个数据类型,p是指向一个长度为5的char[3]类型的数组首地址的指针变量,
并且这里(*p)的括号是必须加的,因为[]的优先级高于*,如果不加,就是创建了一个长度为3的指针数组
释放内存:delete []p;
p=NULL;
如发现错误,请在评论区指正。