C 動態陣列的分配

2021-09-12 10:15:45 字數 3140 閱讀 5780

前言上週,寫了一篇《細說c++中的陣列之靜態陣列》,今天講述一下動態陣列。

陣列是一種順序儲存的資料結構,在定義陣列時,首先要確定陣列的大小。靜態陣列在編譯時就需要確定陣列的大小,所以,為了防止記憶體溢位,我們盡量將陣列定義的大一些,但是這樣太過浪費記憶體。

動態陣列則不同,它不需要在編譯時就確定大小,它的大小在程式執行過程中確定,所以可以根據程式需要而靈活的分配陣列的大小,相比靜態陣列,它更「靈活」、「自由」。但是動態陣列需要進行顯式的記憶體釋放。

動態陣列記憶體分配

動態陣列進行記憶體分配的格式為new t[size],size可以不是常量表示式;如下面的例子所示。

int size = 10; //此處的size不是常量表示式。

int* dynamic_arr2 = new int[size]; //未初始化

可以看出,雖然我們分配了乙個動態陣列,其實返回的是乙個t型別的指標,指標指向的是陣列的第乙個元素,從這個角度來說,動態陣列更像是指標。也是由於這種性質,導致了動態陣列中size可以取0,即返回乙個空指標,即分配乙個空動態陣列是合法的。同樣的道理,返回的是乙個指標,那麼就不能使用begin或者end迭代器進行遍歷。

動態陣列初始化

上面的例子中,dynamic_arr2並未進行初始化,若想進行預設初始化,需要在陣列後面加上乙個小括號。

int* dynamic_arr3 = new intsize; //預設的初始化;

此時陣列中的十個值都為0;

也可以利用花括弧進行顯式的初始化,例子如下;
string* dynamic_arr4 = new string[size]; //顯式的初始化

注意:顯式地初始化時,元素數目不能大於陣列大小。其次,顯式初始化可能會因為編譯器版本原因報錯,筆者在vs2013與vs2017下進行測試,vs2013下在釋放記憶體時出現記憶體錯誤。

動態陣列釋放

釋放動態陣列時,使用delete[ ] arr_name;即在陣列名前加上乙個中括弧;例如

delete [ ] dynamic_arr4;

釋放乙個動態陣列時,或者說是指向陣列的指標時,空括號是必須的。它告訴編譯器,指標指向乙個陣列的第乙個元素。

delete釋放陣列是逆序進行的,最後乙個元素被最先釋放,第乙個元素最後乙個被釋放。

使用動態陣列時,一定要記得顯式的釋放記憶體,否則很容易出錯,比如在乙個大的工程中,某乙個for迴圈中或者某個函式中申請了記憶體卻沒釋放,當函式不斷地被呼叫,這些申請過的記憶體會一直堆積,直到最後退出程式。這很可能造成非常大的麻煩。

比如下面兩個函式;

void not_delete_fun()

void delete_fun()

分別呼叫和釋放兩個函式三次,看看結果;

可以看出,釋放過記憶體後,每次陣列申請的記憶體是一致的,未釋放記憶體的函式,每次申請陣列的記憶體是不一樣的,說明這些陣列申請的記憶體並不會自動釋放,而是會隨著程式執行一致累積。
多維動態陣列的記憶體申請

//-----------------多維陣列記憶體申請-------------------//

int max_num = 10;

int col_num = 5, row_num = 3;

double ***arr3d = new double **[max_num];

for (int i = 0; i < max_num; i++)

從上面可以看出,多維陣列的申請與多維vector的定義類似,是一層一層的申請記憶體的,返回的是指向指標陣列的指標。

先依次宣告維度的大小,然後從最低維度開始申請記憶體。先申請row_num個大小為col_num的陣列,將指向這些陣列的首位址的指標傳遞到大小為row_num的陣列中,構成乙個新的陣列,以此類推,完成記憶體申請。

上面的例子中得到的是乙個10層,3行,5列的陣列。

多維動態陣列記憶體釋放

多維動態陣列的釋放是從最低維度開始的。先釋放掉最低維度的一維陣列,然後依次釋放記憶體,直到釋放掉最高維度。就跟一層一層的拆房子一樣。

for (int i = 0; i < max_num; i++)

delete arr3d[i];

}delete arr3d;

最後c++中還提供了allocator類進行動態陣列的記憶體申請,大家可以根據需要自己學習。在此不做講解。最後附上所有**,需要的小夥伴可以自行使用。

#include

#include

using namespace std;

void not_delete_fun()

void delete_fun()

; //預設的初始化;

string a = "ee";

string *dynamic_arr4 = new string[size]; //顯式的初始化

//string *dynamic_arr4 = new string[size];

//cout << dynamic_arr4[4] << endl;

cout << "未釋放記憶體的陣列位置" << endl;

for (int i = 0; i < 3; i++)

cout << "釋放過記憶體的陣列位置" << endl;

for (int i = 0; i < 3; i++)

//-----------------多維陣列記憶體申請-------------------//

int max_num = 10;

int col_num = 5, row_num = 3;

double ***arr3d = new double **[max_num];

for (int i = 0; i < max_num; i++)

}//cout << arr3d[9][4][2] << endl;

for (int i = 0; i < max_num; i++)

delete arr3d[i];

}delete arr3d;

delete dynamic_arr1;

delete dynamic_arr2;

delete dynamic_arr3;

delete dynamic_arr4;

system("pause");

return 0;

}

C 分配和釋放動態陣列

主程式 include pch.h include point.h intmain point.h pragma once include using namespace std class point intgety const static void showcount 靜態函式成員 將動態陣列...

關於c 的動態分配陣列

在c 中,陣列的長度的值應該是乙個具體的數字,不能是乙個變數。通常我們借助指標來給動態分配陣列 一維陣列 int n cin n int a new int n 二維陣列 int n cin n int a new int n for int i 0 i n i int n cin n char a...

動態分配陣列C 模板

通過動態分配的方法實現了動態陣列的建立,其中包括多種運算子過載。include define size 100 using namespace std template class array 有參建構函式,引數為陣列的長度 array int n length n 有參建構函式,引數為陣列的長度和...