new delete和malloc free的區別

2021-09-26 09:04:32 字數 1616 閱讀 7397

共同點是:都是從堆上申請空間,並且需要使用者手動釋放。

不同的點是:

1.屬性

malloc

和free

是函式,

new和

delete

是操作符

2. 初始化

malloc

申請的空間不會初始化,

new可以初始化

3. 引數

malloc

申請空間時,需要手動計算空間大小並傳遞,

new只需在其後跟上空間的型別即可

4.返回型別

malloc

的返回值為

void*,

在使用時必須強轉,

new不需要,因為

new後跟的是空間的型別

5.申請失敗

malloc

申請空間失敗時,返回的是

null

,因此使用時必須判空,

new不需要,但是

new需要捕獲異常

6.自定義型別

new會先呼叫operator new函式,申請足夠的記憶體(通常底層使用malloc實現)。然後呼叫型別的建構函式,初始化成員變數,最後返回自定義型別指標。delete先呼叫析構函式,然後呼叫operator delete函式釋放記憶體(通常底層使用free實現)。

malloc/free是庫函式,只能動態的申請和釋放記憶體,無法強制要求其做自定義型別物件構造和析構工作。

7. 效率

new/delete

比malloc

和free

的效率稍微低點,因為

new/delete

的底層封裝了

malloc/free

1、 malloc/free是c/c++中的標準庫函式,new/delete是c++中的運算子。它們都用於申請動態記憶體和釋放記憶體。

2、 對於非內部資料物件(eg:類物件),只用malloc/free無法滿足動態物件的要求。這是因為物件在建立的同時需要自動執行建構函式,物件在消亡之前要自動執行析構函式,而由於malloc/free是庫函式而不是運算子,不在編譯器的控制許可權內,也就不能自動執行建構函式和析構函式。因此,不能將執行建構函式和析構函式的任務強加給malloc/free。所以,在c++中需要乙個能完成動態記憶體分配和初始化工作的運算子new,以及乙個能完成清理和釋放記憶體工作的運算子delete。

3、 new建立的是乙個物件,malloc分配的是一塊記憶體區域,用指標來訪問,並且可以在區域裡面移動指標;

對於內部資料型別,由於其沒有建構函式和析構函式的要求,對於內部資料型別來講,malloc/free和new/delete的作用是等價的,都是用來申請動態記憶體和釋放記憶體。

4、什麼是內部資料型別和非內部資料型別?

內部資料型別是編譯器本身就認識的,不需要使用者自己定義。如:基本資料型別:int,char,double等都是內部資料型別;         非內部資料型別不是編譯器本身就認識的,需要使用者自己定義才能讓編譯器識別。如:由class,struct,union等關鍵字修飾 的變數都是非內部資料型別。

5、為什麼庫函式不在編譯器控制許可權內,而運算子在?

庫函式是已經編譯的**,編譯器不會在編譯檢查,由鏈結器將庫同使用者寫的**合成exe檔案。而運算子是否正確,編譯器在編譯掃瞄分析時就可以判定。

malloc free和new delete的區別

malloc free和new delete的區別malloc與free是c c語言的標準庫函式,new delete是c 的運算子。它們都可用於申請動態記憶體和釋放記憶體。對 於非內部資料型別的物件而言,光用maloc free無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡...

new,delete和malloc,free的區別

原型 extern void malloc unsigned int num bytes 說明 分配長度為num bytes位元組的記憶體塊。如果分配成功則返回指向被分配記憶體的指標,分配失敗返回空指標null。當記憶體不再使用時,應使用free 函式將記憶體塊釋放。說明 malloc 向系統申請分...

new delete和malloc free的區別

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