new和malloc的區別

2021-09-24 14:23:20 字數 1313 閱讀 8611

自身屬性

new/delete是c++關鍵字,需要編譯器支援,因此屬於操作符。malloc/free是庫函式,需要標頭檔案支援,因此屬於標準庫函式。

記憶體區域

new操作符從自由儲存區(free store)上為物件動態分配記憶體空間,而malloc函式從堆上動態分配記憶體空間。

自由儲存區是c++基於new操作符的乙個抽象概念,凡是通過new操作符進行記憶體申請,該記憶體即為自由儲存區。

而堆是作業系統所維護的一塊特殊記憶體,用於程式的記憶體動態分配,malloc函式進行記憶體申請退,該記憶體即為堆。

返回型別

new操作符記憶體分配成功時,返回指標型別為物件型別,型別嚴格與物件匹配,無須進行型別轉換,故new是符合型別安全性的操作符。

malloc庫函式記憶體分配成功,返回指標型別為void* ,需要通過強制型別轉換將void* 指標轉換成我們需要的型別。

記憶體分配

使用new操作符申請記憶體分配時無須指定記憶體塊的大小,編譯器會根據型別自動計算所申請記憶體的大小。

使用malloc庫函式需要計算所需記憶體塊的大小,編譯器會根據提供的記憶體大小申請記憶體空間。malloc分配的記憶體不夠的時候,可以用realloc擴容,new沒用這樣操作。

分配失敗

new記憶體分配失敗時,會丟擲bac_malloc異常。malloc分配記憶體失敗時返回null。

因此對於new,正確的姿勢是採用try…catch語法,而malloc則應該判斷指標的返回值。

自定義型別

new/delete不僅分配一段記憶體,而且可以完成動態物件要求,一般在建立物件時自動呼叫建構函式,完成對物件的初始化,在物件消亡時自動的呼叫析構函式。

malloc/free是庫函式,不在編譯器控制範圍之內,只能動態的申請和釋放記憶體,不能完成動態物件要求,無法強制要求其做自定義型別物件構造和析構工作。

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

new的過載

c++允許過載new/delete操作符,特別的,當new不需要為物件分配記憶體,而是指定了乙個位址作為記憶體起始區域。new僅僅在這段記憶體上為物件呼叫建構函式完成初始化工作,並返回此位址。

malloc是乙個庫函式,不允許過載。

new的多次呼叫

new和new 的區別,new 一次分配所有記憶體,多次呼叫建構函式,分別搭配使用delete和delete ,同理,delete多次呼叫析構函式,銷毀陣列中的每個物件。而malloc則只能sizeof(int) * n。

new和malloc的區別

1 new 是c 中的操作符,malloc是c 中的乙個函式 2 new 不止是分配記憶體,而且會呼叫類的建構函式,同理delete會呼叫類的析構函式,而malloc則只分配記憶體,不會進行初始化類成員的工作,同樣free也不會呼叫析構函式 3 記憶體洩漏對於malloc或者new都可以檢查出來的,...

malloc和new的區別

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

new 和 malloc 的區別

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