1. 程式人生 > >關於C++中的動態記憶體分配

關於C++中的動態記憶體分配

1.malloc()、realloc()、free()函式   

這三個函式為c++標準庫中的函式,都在#include <stdlib.h>中。

(1)void *malloc()的返回型別為空指標 void *,因為我們並不知道指標指向什麼型別的資料,所以用void修飾。

用法:

malloc(size_t),size_t為我們要分配的記憶體的大小(單位為位元組)。

若我們要為一個4個int型資料的陣列開闢一塊空間,則:int *p=(int *)malloc(4*sizeof(int))

sizeof(int)得到的是一個int型資料佔用的位元組。用(int *)將void *強制轉換成指向int型資料的指標。

p為我們開闢的記憶體的首地址。開闢的記憶體在內部(即這4個元素所佔的記憶體空間中)地址在邏輯和物理上都是連續的。

若我們又開闢一塊記憶體空間int *q=(int *)malloc(2*sizeof(int)),q內部是邏輯和物理連續,但q和p所開闢的兩塊記憶體之間不一定是連續的。

(2)void *realloc()和malloc()類似,為已存在的記憶體空間重新開闢一塊新的記憶體

用法:

realloc(首地址,重分配記憶體大小)

例如,int A[2]={1,2};  如果我們要向陣列中增加一個元素,則需要對陣列擴容

int *NewAddress=(int *)realloc(A,sizeof(int)*3);

如果在原有的記憶體空間M後緊接著存在一塊連續的記憶體空間N滿足M+N的大小等於我們所需的記憶體大小,則NewAddress==A;

若不存在,則會開闢一塊新滿足我們需求的記憶體空間,原有的記憶體空間裡的值會按順序拷貝到新的記憶體空間中,且原記憶體空間自動釋放,此時,NewAddress!=A

(3)free()  配合malloc()和realloc() ,在不要此記憶體空間儲存的值時,釋放掉此塊記憶體。 free(p)

動態分配是在堆中分配記憶體,需要程式設計師手動釋放

2.new、delete

與malloc()和realloc()和free()不同,new、delete是C++關鍵字,不是標準庫函式。

在使用new時會呼叫物件的建構函式,使用delete時會呼叫解構函式。在給非內建型別分配記憶體的時候,malloc和realloc無法滿足動態記憶體分配(因為要計算所分配的記憶體大小),因而只能使用new關鍵字。

假如我們定義了一個類 Dog,為其動態分配記憶體:

Dog *dog=new Dog[5];

new關鍵字可以根據數字5自動計算5個Dog類的所需的記憶體是多少,併為其分配。得到的是一個指標

用完後要記得釋放: delete []dog;