C和Cpp裏面的動態內存管理

c動態內存管理

c語言裏面的動態內存管理函數,介紹的有4個,分別是malloc,
realloc,calloc,和free,其函數原型分別如下

void *malloc(size_t size);
void *calloc(size_t num_elements,size_t element_size);
void realloc(void ptr,size_t new_size);
void free(void* pointer);

malloc函數是在堆空間上開闢一塊合適的空間,並且返回一個指向這塊內存的指針,這塊開闢的空間沒有進行任何方式的初始化,如果需要初始化,必須自己手動初始化。

calloc函數也是在堆空間上開闢一塊合適的空間,並且返回一個指向這塊內存的指針,但是,在返回指針之前,這塊空間已經自動初始化爲0了。不用自己在初始化,這是malloc 和calloc 最大的區別。

realloc函數是調整開闢的空間的大小,如果空間開闢小了,realloc函數會在開闢的一塊空間,將新開闢的空間添加到原來空間的後面,新空間沒有初始化,當然原來空間內容依然保留,如果空間不夠開闢,realloc將分配另一塊正確大小的空間,並把原來那塊內存的內容複製到新的空間裏,並且銷燬原來那塊空間,當然指針指向新的那塊空間,如果空間開闢大了,空間尾部被拿掉,剩餘部分的原先內容依然保留。

free函數是釋放開闢的內存,接受的是指向內存的指針,
free的時候要注意,

> 同一塊空間不能free兩次,

>free不能只free空間的一部分

>不能不free

> free完,要將指針置空

> malloc和free要成對出現

cpp動態內存管理

cpp提供new和delete標識符(不是函數),來實現動態內存管理;
有兩種形式
int *p1 = new int ;
delete p1;
int *p2 = new int[10];
delete[]p2;

在自定義類型中,例如類中,new辦了兩件事

> 1,開闢堆空間
> 2,調用構造函數

當然delete也辦了兩件事,

> 調用析構函數
> 回收堆空間

內置類型中,new delete和malloc 和free 是一樣的

當然cpp中也提供了庫函數operator new()和opreator delete()
來管理內存。
只不過這兩者是new和delete的底層代碼,使用new的時候會調用operator new,operator new會調用operator new[],operator[]會調用malloc,而delete會調用opreator delete[] ,operator[] 會調用free,最後還是回到了 malloc 和free上面,
因此,只要你理解了這層關係,你可以不用匹配寫new和delete ,但是對於初學者來說,一定要匹配寫,否則很容易弄錯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章