共同點是:都是從堆上申請空間,並且需要使用者手動釋放。
不同的點是:
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...