malloc free與new delete的區別

2021-06-21 16:59:54 字數 1325 閱讀 5319

malloc/free與new/delete的區別

相同點:都可用於申請動態記憶體和釋放記憶體。

不同點:

(1)操作物件不同。malloc/free是c/c++語言的標準庫函式,new/delete是c++的運算子。由於malloc/free是庫函式而不是運算子,不再編譯器控制許可權之內,所以無法執行建構函式和析構函式。

new的執行過程是:首先,呼叫名為operator new的標準庫函式,分配足夠大的原始的未型別化的記憶體,以儲存指定型別的乙個物件;接下來,執行該型別的乙個建構函式,用指定初始化式構造物件;最後,返回指向新分配並構造的物件的指標。

delete的執行過程是,首先,對sp所指向的物件執行適當的析構函式;然後通過呼叫名為operator delete的標準庫函式釋放該物件所用記憶體。

(2)用法上也有所不同

函式malloc的原型如下:void* malloc(size_t size);

用malloc申請一塊長度為length的整數型別的記憶體,程式如下:

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

1、 malloc返回值的型別是void*,所以在呼叫malloc時要顯式地進行型別轉換,將void*轉換成所需要的指標型別。

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

函式free的原型如下

void free(void* memblock);

語句free(p)用來釋放記憶體,如果p是null指標,那麼free對p無論操作多少次都不會出問題。如果p不是null指標,那麼free對p連續操作兩次就會導致程式執行錯誤。

運算子new使用起來比函式malloc簡單的多,例如int* p2=new int[length];

這是因為new內建了sizeof、型別轉換和型別安全檢查。對於非內部資料型別的物件而言,new在建立動態物件的同時完成了初始化工作(呼叫建構函式)。如果用new建立物件陣列,那麼只能使用物件的無引數建構函式。

總結一下,malloc/free與new/delete的不同之處

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

2、 new自動計算需要分配的空間,而malloc需要手動計算位元組數。

3、 new是型別安全的,malloc不是。

4、 new呼叫operator new分配足夠的空間,並呼叫相關物件的建構函式,而malloc不能呼叫建構函式;delete將呼叫該例項的析構函式,然後呼叫類的operator new,以釋放該例項占用的空間,而free不能呼叫析構函式。

malloc/free需要庫檔案支援,new/delete則不需要。

malloc free與new delete的區別

相同點 都可用於申請動態記憶體和釋放記憶體 不同點 1 操作物件有所不同。malloc與free是c c 語言的標準庫函式,new delete 是c 的運算子。對於非內部資料類的物件而言,光用maloc free 無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件消亡之前要自動執行析...

malloc free與new delete的區別

相同點 都可用於申請動態記憶體和釋放記憶體 不同點 1 操作物件有所不同。malloc與free是c c 語言的標準庫函式,new delete 是c 的運算子。對於非內部資料類的物件而言,光用maloc free 無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件消亡之前要自動執行析...

malloc free與new delete的區別

相同點 都可用於申請動態記憶體和釋放記憶體 不同點 1 操作物件有所不同。malloc與free是c c 語言的標準庫函式,new delete 是c 的運算子。對於非內部資料類的物件而言,光用maloc free 無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件消亡之前要自動執行析...