關於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;