C 動態記憶體分配

2021-08-02 05:37:35 字數 3440 閱讀 9205

筆者介紹:姜雪偉,it公司技術合夥人,it高階講師,csdn社群專家,特邀編輯,暢銷書作者,已出版書籍:《手把手教你架構3d遊戲引擎》電子工業出版社和《unity3d實戰核心技術詳解》電子工業出版社等。

c / c ++中的動態記憶體分配是指程式設計師手動執行記憶體分配,動態分配的記憶體分配給堆,非靜態和區域性變數獲取在stack上分配的記憶體。詳情檢視上篇博文:c程式的記憶體布局。

什麼是應用程式?

動態分配的記憶體的乙個用途是分配可變大小的記憶體,除了可變長度陣列之外,編譯器是不可能分配記憶體的。

最重要的用途是為程式設計師提供靈活性,每當我們需要,並且我們不再需要了,我們可以隨時分配和釋放記憶體,很多情況下,這種靈活性有所幫助,這種例子是鏈結列表,樹等。

與分配給正常變數的記憶體有什麼不同?

對於「int a」,「char str [10]」等常規變數,記憶體將自動分配和釋放。 對於動態分配的記憶體,如「int * p = new int [10]」,程式設計師有責任在不再需要時釋放記憶體。 如果程式設計師沒有釋放記憶體,它會導致記憶體洩漏(記憶體沒有釋放,直到程式終止)。

什麼是記憶體洩漏,如何避免?

當程式設計師在堆中建立記憶體並忘記刪除記憶體時,會發生記憶體洩漏,記憶體洩漏對於程式而言是特別嚴重的問題。以下是記憶體洩漏的**:

/* function with memory leak */

#include void f()

為了避免記憶體洩漏,分配給堆上的記憶體應該不再需要時被釋放。

#include ;

void f()

如何在c ++中分配/釋放記憶體?c使用malloc()和calloc()函式在執行時動態分配記憶體,並使用free()函式釋放動態分配的記憶體。 c ++支援這些功能,並且還有兩個運算子new和delete來執行分配和釋放記憶體的任務。

這篇文章是關於new和delete

的操作符。

new操作符表示堆上的記憶體分配請求。 如果有足夠的記憶體可用,new操作符初始化記憶體並將新分配和初始化的記憶體的位址返回給指標變數。

使用new操作符的語法:要分配任何資料型別的記憶體,語法為:

pointer-variable = new data-type;
這裡,指標變數是資料型別型別的指標,資料型別可以是任何內建資料型別,包括陣列或任何使用者定義的資料型別,包括結構和類。

// pointer initialized with null

// then request memory for the variable

int *p = null;

p = new int;

or// combine declaration of pointer

// and their assignment

int *p = new int;

初始化記憶體,我們可以使用new 初始化記憶體

pointer-variable = new data-type(value);

example:

int *p = new int(25);

float *q = new float(75.25);

分配記憶體塊:new運算子也用於分配資料型別的記憶體塊(陣列)。

pointer-variable = new data-type[size];
其中size(乙個變數)指定陣列中的元素數。

int *p = new int[10]
動態地為型別int連續分配10個整數的記憶體,並返回指向序列的第乙個元素的指標,分配給p(指標),p [0]是指第乙個元素,p [1]是指第二個元素等等。

陣列宣告用new操作符

宣告陣列和使用new記憶體塊分配最重要的區別是,陣列由編譯器釋放(如果陣列是本地的,則在函式返回或完成時釋放)。 但是,動態分配的陣列總是保留在那裡,直到它們被程式設計師或程式終止釋放。

如果執行時記憶體不足,怎麼辦?

如果堆中沒有足夠的記憶體可用於分配,則new請求通過丟擲型別為std :: bad_alloc的異常來指示失敗,而new操作符返回乙個指標。 因此,在使用該程式之前,檢查新的指標變數可能是乙個好主意。

int *p = new int;

if (!p)

既然程式設計師有責任釋放動態分配的記憶體,所以使用c ++語言為程式設計師提供了delete操作符。

delete pointer-variable;
這裡,指標變數是指向由new建立的資料物件的指標。

例子:

delete p;

delete q;

要釋放由指標變數指向的動態分配的陣列,請使用以下形式的delete:

// release block of memory 

// pointed by pointer-variable

delete pointer-variable;

example:

// it will free the entire array

// pointed by p.

delete p;

完整的案例**如下所示:

#include using namespace std;

int main ()

// request block of memory

// using new operator

float *r = new float(75.25);

cout << "value of r: " << *r << endl;

// request block of memory of size n

int n = 5;

int *q = new int[n];

if (!p)

cout << "allocation of memory failed\n";

else

// freed the allocated memory

delete p;

delete r;

// freed the block of allocated memory

delete q;

return 0;

}

輸出結果:

value of p: 29

value of r: 75.25

value store in block of memory: 1 2 3 4 5

c語言動態記憶體分配 C 動態記憶體分配

動態記憶體分配 雖然通過陣列就可以對大量的資料和物件進行有效地管理,但是很多情況下,在程式執行之前,我們並不能確切地知道陣列中會有多少個元素。這種情況下,如果陣列宣告過大,就會造成浪費 宣告過小,就會影響處理。在c 中,動態記憶體分配技術可以保證程式在執行過程中按照需要申請適量記憶體,使用後釋放,從...

c 動態記憶體分配

c語言中提供的動態記憶體分配為了解決陣列的靜態的分配方式的問題 即陣列大小必須在定義時指定,程式在執行時不能動態改變陣列的大小 在標準庫中提供了三個動態記憶體分配的函式供程式呼叫,下面將分別對這三個函式進行介紹 1.void malloc size t size malloc 在分配一段連續的記憶體...

C 動態記憶體分配

c 動態記憶體分配 c c 定義了4個記憶體區間 區,全域性變數與靜態變數區,區域性變數區即棧區,動態儲存區,即堆 heap 區或自由儲存區 free store 堆的概念 通常定義變數 或物件 編譯器在編譯時都可以根據該變數 或物件 的型別知道所需記憶體空間的大小,從而系統在適當的時候為他們分配確...