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.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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章