C 中的動態記憶體管理

2021-09-30 13:41:48 字數 2176 閱讀 8394

相同點:

都可用於申請動態記憶體和釋放記憶體

不同點:

(1)操作物件不同

malloc/free是c++/c語言的標準庫函式,new/delete是c++的運算子,對於非內部資料型別的物件而言,只有malloc、free是無法滿足動態物件的要求的。因為物件在建立的時候會自動呼叫建構函式,物件消亡時會自動呼叫析構函式。因為malloc/free是庫函式而不是運算子,不在編譯器控制的範圍內,不能夠執行構造函和析構函式

(2)用法不同

函式malloc 的原型如下:

void*malloc(size_t size)

用malloc申請一塊長度為n的整數型別的空間,**如下

int p = (int)malloc(sizeof(int)*n);

注意:

<1>. malloc返回值是void* ,歲喲呼叫時要進行顯示的型別轉換,講void* 轉換成所需要的型別

<2>.malloc函式本身並不識別要申請的記憶體是什麼型別,只關心記憶體的總位元組數

函式free的原型:

void free(void* memblock)

為什麼free函式不像malloc函式那樣複雜呢?這是因為指標p 的型別以及他所指向的記憶體的容量都是事先知道的,free(p)才可以正確的釋放p,如果p是null,free對p烏雲操作多少次都不會出現問題,而如果p不是null,那麼free進行兩次就會出現錯誤,就是已經釋放的空間連續釋放,就會出現問題

new、delete

運算子new 使用起來要比函式malloc 簡單得多,例如:

int p1 = (int )malloc(sizeof(int) * length);

int *p2 = new int[length];

這是因為new 內建了sizeof、型別轉換和型別安全檢查功能。對於非內部資料型別的物件而言,new 在建立動態物件的同時完成了初始化工作。

delete是與new成對出現的,new/delete new/delete 注意一定要成對使用

1、本質區別

malloc/free是c/c++語言的標準庫函式,new/delete是c++的運算子。

對於使用者自定義的物件而言,用maloc/free無法滿足動態管理物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行析構函式。由於malloc/free是庫函式而不是運算子,不在編譯器控制許可權之內,不能夠把執行建構函式和析構函式的任務強加於malloc/free。因此c++需要乙個能完成動態記憶體分配和初始化工作的運算子new,以及乙個能完成清理與釋放記憶體工作的運算子delete。

2、聯絡:

既然new/delete的功能完全覆蓋了malloc/free,為什麼c++還保留malloc/free呢?因為c++程式經常要呼叫c函式,而c程式只能用malloc/free管理動態記憶體。如果用free釋放「new建立的動態物件」,那麼該物件因無法執行析構函式而可能導致程式出錯。如果用delete釋放「malloc申請的動態記憶體」,理論上講程式不會出錯,但是該程式的可讀性很差。所以new/delete、malloc/free必須配對使用。

不管是new還是new 都呼叫了operator new函式,在operator new函式中,又呼叫了malloc函式。

當然new 呼叫了operator new 而operator new 又呼叫了operator new函式。

在底層實現中,new就是用malloc函式來開闢空間的。

#define new_array(ptr,type,n)\

do \

while(false);

//為什麼在申請空間的時候要多申請四個位元組呢?這是因為需要用來記錄物件的個數,可以知道在析構的是後要呼叫幾次

//析構函式

#define delete_array(ptr,type) \

do \

}while(false);

//注意:在用巨集實現的收,一定要加上續行符。

c 中的動態記憶體管理

c 中的動態記憶體管理問題 c 中使用new和delete實現動態記憶體管理。new和delete實現動態管理物件,new和delete實現動態管理物件陣列。c 中的new和delete運算子均使用我們c中學過的malloc和delete函式實現動態記憶體的開闢。首先,先簡單介紹下c中的幾個動態記憶...

C 動態記憶體管理

我們都知道在c 中可以用new malloc動態分配記憶體空間,delete free釋放動態開闢的記憶體空間。1.那麼既然c 中有了可以動態開闢記憶體的函式為什麼又要有new delete呢?c 中的malloc free是繼承c語言中的malloc free,它的用法和在c語言中的用法一模一樣。...

C 動態記憶體管理

1 總結並剖析malloc free和new delete之間關係和差異。1 他們都是動態記憶體管理的入口 2 malloc要計算空間大小,返回值要強轉 new自動計算位元組大小,返回值是相應型別的指標 3 malloc只開闢空間 new開闢空間 呼叫建構函式初始化 delete呼叫析構函式清理 釋...