malloc free與new delete的區別

2022-08-03 10:18:12 字數 2310 閱讀 8771

malloc/free與new/delete的區別:

相同點:都可用於動態記憶體分配與釋放

不同點:

1):操作物件有所不同。

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

由於malloc/free是庫函式而不是運算子,不在編譯器控制許可權之內,所以無法執行建構函式和析構函式;

new的執行過程:

//

new的執行過程:

1:首先呼叫名為operator new的標準庫函式,分配足夠大的原始的未型別化的記憶體,用來儲存指定型別的乙個物件;

2:接下來,執行該型別的乙個建構函式,用指定初始化式構造物件;

3:最後返回指向新分配並構造的物件的指標。

delete的執行過程:

1

:首先,對sp指向的物件執行適當的析構函式

2:然後,用過呼叫名為operator delete的標準庫函式釋放該物件所用記憶體。

以上operator new 與 operator delete 分別對應於malloc 與free。

2):用法上也有所不同:

函式malloc的原型如下:

void *malloc(size_t size);

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

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建立陣列,那麼只能使用物件的無引數建構函式。例如:

obj *objects = new obj[100];//

建立100個動態物件

不能寫成:

obj *objects = new obj[100](1);//

建立100個動態物件並同時賦值為1 error

在用delete釋放物件陣列時,留意不要丟了符號""。例如:

delete objects;//

正確的用法

delete objects;//

錯誤的用法

總結:

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

2):new自動計算需要分配的空間,而malloc需要手工計算計算位元組數;

3):new是型別安全的,而malloc不是;例如:

int *p = new

float[2];//

編譯時指出錯誤

int *p = (int*)malloc(2*sizeof(float));//

編譯時無法指出錯誤

4);new呼叫operator new分配足夠的空間,並呼叫相關物件的建構函式,而malloc不能呼叫建構函式;

delete呼叫相關物件的析構函式,然後呼叫operator delete以釋放空間,而malloc不能呼叫析構函式;

5):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 無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件消亡之前要自動執行析...