C++ 动态内存的分配与释放(new&delete)

引言

在内存中,程序为保存某种类型数据如数组而分配 一块内存空间。 用完后就需要把先前占用的内存空间释放给内存, 以后重新分配,供程序的其它部分使用

new运算符(对应malloc函数)

1
指针变量 = new 数据类型;

new从内存中分配内存空间,并返回指向该内 存的首地址,该地址存放于指针变量中

delete运算符(对应free函数)

运算符delete用于释放new分配的内存空间, 它的使用形式为

1
delete 指针变量;

其中的指针变量保存着new动态分配的内存的首地址

注意

(a) 用new获取的内存空间,必须用delete进行释放; ( (b) 对一个指针只能调用一次delete; (c) 用delete运算符作用的对象必须是用new分配的内 存空间的首地址。

实例

1
2
3
4
5
6
7
8
#include <iostream>
using namespace std; 
int main() {
int *p; 
p=new int; // 分配内存空间 *p=5;
cout<<*p;
delete p; 
}// 释放内存空间

用new建立数组类型的变量

1
指针变量 = new 数据类型[数组大小] ;

此时指针变量指向第一个数组元素的地址。使用new 分配数组时,不能提供初始值

使用new建立的数组 变量也由delete释放,其形式为:

1
delete 指针变量;

同样,也可以用new来为多维数组分配空间,但是除第一维可以为变量外,其它维数都必须是常量

注意在使用delete时,不用考虑数组的维数。 有时,并不能保证一定可以从堆内存中获得所需空间,当不能成功地分配到所需要的内存时,new返回0,即空指针。因此我们可以通过判断new的返回值是否为0,来得知系统中是否有足够的空闲内存来供程序使用

例子

1
2
3
4
5
int *p= new int[100];
if(p==0) {
	cout<<cant allocate more memory,terminating."<<endl;
	exit(1);
}

一维数组

1
2
3
4
5
// 动态分配,数组长度为 m
int *array=new int [m];
 
//释放内存
delete [] array;

二维数组

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
using namespace std;
 
int main()
{
    int **p;   
    int i,j;   //p[4][8] 
    //开始分配4行8列的二维数据   
    p = new int *[4];
    for(i=0;i<4;i++){
        p[i]=new int [8];
    }
 
    for(i=0; i<4; i++){
        for(j=0; j<8; j++){
            p[i][j] = j*i;
        }
    }   
    //打印数据   
    for(i=0; i<4; i++){
        for(j=0; j<8; j++)     
        {   
            if(j==0) cout<<endl;   
            cout<<p[i][j]<<"\t";   
        }
    }   
    //开始释放申请的堆   
    for(i=0; i<4; i++){
        delete [] p[i];   
    }
    delete [] p;   
    return 0;
}

三维数组

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
int ***array;
// 假定数组第一维为 m, 第二维为 n, 第三维为h
// 动态分配空间
array = new int **[m];
for( int i=0; i<m; i++ )
{
    array[i] = new int *[n];
    for( int j=0; j<n; j++ )
    {
        array[i][j] = new int [h];
    }
}
//释放
for( int i=0; i<m; i++ )
{
    for( int j=0; j<n; j++ )
    {
        delete[] array[i][j];
    }
    delete[] array[i];
}
delete[] array;
experience
使用 Hugo 构建
主题 StackJimmy 设计