new與malloc的區別

2021-09-26 09:54:05 字數 2029 閱讀 2191

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