参考资料:
《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;