C++中使用简便而强大的new和delete运算符来进行动态内存的分配.
值得注意的是,new和delete和c语言中的malloc和free不同,new和delete是运算符,因此执行效率更高.
如何使用new , delete 呢?
首先我们来看一段代码:
int *p = new int;
我们可以看到有那些元素.
首先是int, 它的含义是声明指针类型;
其次是*p, p是指针变量(注意,指针也是一种变量,可以理解为它的类型为int *)名.
= 是赋值符号,为什么是赋值符号呢?因为后面一段代码返回的是一个地址,地址赋给了p
new int 是什么意思呢?new是一种运算符,它返回的是一种数据类型的内存地址.
一般格式如下:
new typename (value)
所以,之前那一段代码也可以拆分为:
int *p;
p = new int;
如果想给 *p 赋值,应该这样
int *p = new int (12);
这是最基本的声明动态变量方法.
如何用new来声明数组? 首先介绍一维数组:
int *p = new int[4];
和上面不同的是,这段代码后面是 [4],这意味着什么呢?
这意味着new了一个数组元素数为4的一维数组.
OK,任务完成. 可是,细心的小伙伴可能会发现,这样的话, 上面提到给变量赋值的(value)怎么办呢?放在哪呢?
事实上,C++不支持在动态分配数组内存的时候给数组赋初值.所以,想要赋初值,只能自己写个循环语句赋过去咯.
一维数组是这样,那么二维乃至多维呢?
二维可以这样:
int (*p)[3] = new int [4][3];
这样就动态声明了一个行是4, 列是3的数组.
值得注意的是,在此代码 [3] 这个位置,"3"的值可以是常量(1,2...),或者const常量,不能是变量.(表示被坑过) "4"处,可以是变量
还有另一种声明方式:
int **p = new int *[n];
for( int i=0;i<n;++i ) {
p[i] = new int [m];
}
这样就生成了行为n, 列为m的二维数组了.
这样的方法较前一种复杂些,但m, n都可以是变量.
可以这么理解:先生成了一个以为数组,然后再在每个元素的位置生成一个一维数组,这样,一个二维数组就这样建立起来了.
同样,参照这种方法,可以建立多维数组.
new讲完了,那么delete呢?
delete的作用不做赘述, 我们只讲各种形式如何delete.
首先
int *p = new int;
int *p = new int(1);
这两种delete是一样的
delete p;
然后
int *p = new int [4];
这是一维数组,所以delete的方式有些不同
delete []p;
只有[]的不同:[]告诉程序,应释放整个数组,而不仅是指针指向的元素.
二维数组呢?
for( int i=0;i<n;++i )
{
delete [] p[i];
}
delete [] p;
注意:
不要用delete来释放同一个内存两次,程序运行会出错.
不要用delete来释放不是new分配的内存
对空指针应用delete是安全的.