C和C++动态分配内存

参考资料:
《C/C++学习指南(语法篇)》
《C++ Primer中文版》

1 基本语法
动态分配内存有两种方式:
① malloc申请内存+free释放内存:
头文件:#include<stdlib.h>
用法示例:char* p=(char*) malloc(84);
含义:申请能存放84个char类型数据的空间,也就是说,开辟一块84字节的内存空间,p为指向这块空间的指针
通用的方法为:

Object* p=(Object*)malloc(sizeof(Object));

其中,Object可以是C或C++本来就定义好的类型,也可以是自己定义的类型。
free可以释放malloc开辟的内存,不是malloc开辟的内存无法通过free释放。

free(p);

② new申请内存+delete释放内存
头文件:不需要
用法示例:

string* sp=new string("a value"); //分配并初始化一个string对象
string* arr=new string[10]; //分配10个默认初始化的string对象

通用的方法为:

Object* p2=new Object;

开辟一个存放Object的存储空间。

Object* p2=new Object(data);

开辟一个存放Object的空间,并指定初值为data。
其中,Object可以是C或C++本来就定义好的类型,也可以是自己定义的类型。
用delete释放空间:

delete p2;

2 处理数组
① 用malloc和free创建和释放多维数组的空间
参考资料:http://blog.youkuaiyun.com/schoolers/article/details/5945220
给二维数组(m*n)分配空间:

char **a, i;  // 先分配m个指针单元,注意是指针单元,所以每个单元的大小是sizeof(char *)
a = (char **)malloc(m * sizeof(char *)); // 再分配n个字符单元,上面的m个指针单元指向这n个字符单元首地址
for(i = 0; i < m; i++)   a[i] = (char *)malloc(n * sizeof(char));

释放:

int i;
for(i=0;i<m;i++)  free((void *)a[i]);
free((void *)a);

为三维数组(m*n*p)分配空间:

char ***a, i, j;
a = (char ***)malloc(m * sizeof(char **));
for(i = 0; i < m; ++i)   a[i] = (char **)malloc(n * sizeof(char *));
for(i = 0; i < m; ++i)
    for(j = 0; j < n; ++j)
        a[i][j] = (char *)malloc(p * sizeof(char));

释放:

int i,j,;
for(i = 0; i < m; ++i)
    for(j = 0; j < n; ++j)
        free((void *)a[i][j]);   
for(i = 0; i < m; ++i)
    free((void *)a[i]);
free((void *)a);

② 用new和delete创建和释放多维数组的空间
参考资料:http://www.cnblogs.com/Sylla-Zhang/archive/2012/10/08/2715300.html
一维数组动态内存的创建:

int *array1D;
array1D = new int [m];

释放:

delete [] array1D;

二维数组动态内存的创建:

int **array2D;
//假定数组第一维长度为m, 第二维长度为n
//动态分配空间
array2D = new int *[m];
for( int i=0; i<m; i++ )
    array2D[i] = new int [n]  ;

释放:

for( int i=0; i<m; i++ )
{
    delete [] array2D[i];
}
delete array2D;

事实上二维数组空间的释放还可以更简单地用:delete [] array2D;
三维数组动态内存的创建:

int ***array3D;
//假定数组第一维为m, 第二维为n, 第三维为h
//动态分配空间
array3D = new int **[m];
for( int i=0; i<m; i++ )
{
    array3D[i] = new int *[n];
    for( int j=0; j<n; j++ )
    {
         array3D[i][j] = new int [h];
    }
}

释放

for( int i=0; i<m; i++ )
{
    for( int j=0; j<n; j++ )
    {
         delete array3D[i][j];
    }
    delete array3D[i];
}
delete array3D;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值