參考資料:
《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.csdn.net/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;