1.申請記憶體的所在位置
new是在自由儲存區上申請記憶體;malloc是在堆上申請記憶體。
凡是由new操作符申請的記憶體空間,該記憶體就是自由儲存區,這是c++裡的乙個概念;而堆是作業系統裡的乙個概念,是作業系統維護的一塊特殊記憶體,用於程式的動態儲存。
malloc是從堆上分配記憶體,用free釋放已分配的記憶體;而new能否在堆上分配記憶體,這取決與new的實現細節,具體來說,new可以在堆上分配記憶體,也可以在靜態儲存區上分配。
下面這段**,說明了new可以在靜態儲存區上分配記憶體。
2.返回型別的安全性不同
new操作符記憶體分配成功時,返回的是物件型別的指標,型別與物件嚴格匹配,無需進行強制型別轉換;而malloc記憶體分配成功返回的是void *,需要進行強制型別轉換才能變成我們需要的型別。
3.記憶體分配失敗時的返回值不同
new分配記憶體失敗時,返回的是bac_alloc異常,不會返回null;而malloc分配記憶體失敗時,返回null。
在c語言裡,通常用返回結果是不是null來判斷記憶體是否分配成功;但是到了c++裡,則不能,應為new失敗並不能返回null,所以在c++裡,應該使用異常機制,即try-catch結構。
4.是否需要指定記憶體的大小
new在分配記憶體時,不要指定分配記憶體的大小,編譯器會根據型別資訊計算;而malloc則要顯式的指出所需的記憶體。
5.是否呼叫構造/析構函式
new在分配記憶體時會經歷三個步驟:
delete釋放記憶體會經歷兩個步驟:
new給物件分配記憶體空間時,會呼叫物件型別的建構函式,而malloc則不會呼叫建構函式。這就造成了,在c++裡,new是更加適用的,因為在涉及到類有構造/析構函式時,new的效果更好。
下面這段程式說明了new呼叫了類的建構函式,類成員a被初始化為1;而malloc沒有嗲用建構函式,其值不為1。
#include
"stdafx.h"
#include
using
namespace std;
class
aint a;
double b;};
intmain()
除錯結果如下:
6.對陣列的處理不同
c++提供了new和delete來專門處理陣列;而malloc則不知道是不是陣列,反正就是分配一塊記憶體,所以要用malloc動態分配陣列記憶體時,還是要手動給定陣列所需記憶體的大小。
7.new和malloc是否可以相互呼叫
operator new和operator delete可以基於malloc來實現;但malloc的實現不可以去呼叫malloc。
8.是否可以被過載
mew和delete可以被過載,而malloc/free不允許被過載。
9.是否能夠直觀的重新分配記憶體
在malloc分配記憶體之後,如果發現記憶體不足,可以適用realloc函式進行記憶體的重新分配。realloc重新分配記憶體的原理如下:realloc會判斷當前指標所指的記憶體是否有連續的空間,如果有,則原地擴大分配的記憶體位址,並返回原來位址指標;如果空間不夠,先按照新指定的大小分配空間,並將原有資料從頭到尾拷貝到新分配的記憶體空間,而後釋放原來的記憶體區域。
new則沒有這樣直觀的配套設施來擴充記憶體。
10.記憶體分配不足時相應的處理不同
new在記憶體分配不足時,會丟擲異常,那麼在丟擲異常之後,它會先呼叫乙個使用者指定的錯誤處理函式,即new_handler。
而malloc,客戶並不能夠去程式設計決定記憶體不足時要幹什麼事,智慧型看著malloc返回null。
new與malloc的區別
1,malloc與free是c c語言的標準庫函式,new delete是c 的運算子。它們都可用於申請動態記憶體和釋放記憶體。2,對於非內部資料型別的物件而言,光用maloc free無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行析構函式。由於malloc f...
new與malloc的區別
malloc 與free 是c c 語言的標準庫函式,new delete 是c 的運算子。它們都可用於申請動態記憶體和釋放記憶體。對於非內部資料型別的物件而言,光用maloc free 無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行析構函式。由於 malloc...
Malloc與new 的區別
malloc與new 的區別 1,malloc與free是c c語言的標準庫函式,new delete是c 的運算子。它們都可用於申請動態記憶體和釋放記憶體。2,對於非內部資料型別的物件而言,光用maloc free無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行...