動態記憶體分配

2022-04-07 07:59:58 字數 1644 閱讀 2295

因為直接學了c++

,所以對

c的一些細節了解不是很清楚,於是在這裡補充一點小知識——動態記憶體分配,

c++中相關的是

new和

delete,而c

中相關的是

malloc

、calloc

、realloc

和free

。注:alloc

代表allocate

,意為「分配」。

次的問題,當時我回答了,delete p一般用來刪除給單個元素分配的記憶體,而

delete p

是用來刪除陣列的記憶體分配。

而面試官繼續問,「這兩個可以互換使用嗎?」

然後我就不會了,第一次被問後忘記去查,所以第二次自然也杯具了。

在多數編譯器中兩種表示式等價,使用沒有區別,操作符過載不同而已。不過,那是編譯器人家自己優化得好,所以真正的區別是……

對於基本資料型別(單個或陣列),delete p和delete p無區別。

對於自定義的類

#include using

namespace

std;

class

s ~s()

};int

main()

view code

執行結果:

constructor

constructor

deconstructor

constructor

constructor

deconstructor

deconstructor

原型:

void * malloc (size_t nbytes);
用法:

int* p = (int*)malloc(5*sizeof(int));
注意:malloc

返回的是空指標,所以使用時需要進行轉換,詳見

空指標與函式指標。

原型:

void * calloc (size_t nelements, size_t size);
用法:

int *p = (int *) calloc (5, sizeof(int));
注意:malloc

和calloc

除了引數不同之外,還有一點不同就是

calloc 

會將所有元素初始化為0。

原型:

void * realloc (void * pointer, size_t size);
用法:

int *q = realloc(p, 5*sizeof(int));
注意:第乙個引數p是乙個已經被分配記憶體的指標或空指標,第二個引數是總的位元組數。這個函式可能需要改變記憶體塊的位址以便能夠分配足夠的記憶體來滿足新的長度要求。記憶體分配成功後,該函式將p指向的內容完整的複製到新的記憶體中並返回新的位址;若記憶體分配失敗,則返回null指標,p和p指向的內容不變。

原型:

void free (void * pointer);
用法:

free(p);
注意:這個函式只能被用來釋放由函式malloc, calloc 和realloc所分配的空間。

動態記憶體分配

在c 中建立乙個物件時,我們必須要為這個物件申請一塊記憶體,而且要用建構函式對這塊記憶體進行初始化。c 中的new和delete相對於c的庫函式malloc和free在這方面有很大的優勢,所以我們主要講的是運算子new和delete。當用new來建立乙個物件時,它會自動在堆裡為物件分配記憶體並且為這...

動態記憶體分配

為什麼使用動態記憶體分配?c語言中的一切操作都是基於記憶體的 變數和陣列都是記憶體的別名,如何分配這些記憶體由編譯器在編譯期間決定 定義陣列的時候必須指定陣列唱的 而陣列長度是在編譯期就必須決定的 需求 程式執行的過程中,可能需要使用一些額外的記憶體空間 malloc和free malloc和fre...

動態記憶體分配

c的儲存類別有4種 自動的 auto 靜態的 statics 暫存器的 register 外部的 extern 全域性變數時分配在記憶體中的靜態儲存區 靜態區域性變數屬於靜態儲存類別,在靜態儲存區內分配儲存單元,是在編譯時賦初值的,只賦初值一次,在程式執行時它已有初值,以後每次呼叫函式時不再重新賦初...