C 中malloc和new的區別

2021-08-10 17:33:07 字數 1624 閱讀 2090

1.申請的記憶體所在位置

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

自由儲存區不僅可以是堆,還可以是靜態儲存區,這都要看operator new在**為物件分配記憶體。

2.返回型別安全性

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

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

3.記憶體分配失敗時的返回值

new記憶體分配失敗時,會丟擲bac_alloc異常,它不會返回null;

malloc分配記憶體失敗時返回null。

4.是否需要指定記憶體塊的大小

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

而malloc則需要顯式地指出所需記憶體的尺寸。

5,是否呼叫建構函式/析構函式

使用new操作符來分配物件記憶體時會經歷三個步驟:

step1:呼叫operator new函式(對於陣列是operator new)分配一塊足夠大的,原始的,未命名的記憶體空間以便儲存特定型別的物件。

step2:編譯器執行相應的建構函式以構造物件,並為其傳入初值。

step3:物件構造完成後,返回乙個指向該物件的指標。

使用delete操作符來釋放物件記憶體時會經歷兩個步驟:

step1:呼叫物件的析構函式

step2:編譯器呼叫operator delete(或operator delete)函式釋放記憶體空間。

所以,new/delete會呼叫物件的建構函式/析構函式以完成物件的構造和析構。而malloc不會呼叫。

6.對陣列的處理

new,delete專門處理陣列型別,malloc只需用手動自定陣列的大小。

7.new與malloc是否可以相互呼叫

operator new / operator delete 的實現可以基於malloc。 而malloc的實現不可以呼叫new。

8.是否可以被過載

operator new / operator delete可以被過載。

malloc和free不允許過載。

9.能夠直觀地重新分配記憶體

使用malloc分配的記憶體後,如果在使用過程中發現記憶體不足,可以使用realloc函式進行記憶體重新分配實現記憶體的擴充。

realloc先判斷當前的指標所指記憶體是否有足夠的連續空間,如果有,原地擴大可分配的記憶體位址,並返回原來的位址指標;

如果空間不夠,先按照新指定的大小分配空間,將原有資料從頭到尾拷貝到新分配的記憶體區域,而後釋放原來的記憶體區域。

new沒有這樣只管的配套設施來擴充記憶體。

總結:

C 中new和malloc的區別

1 new是c 中的操作符,malloc是c中的乙個函式.new是個操作符,和什麼 有一樣的地位,malloc是個分配記憶體的函式,供你呼叫的.正因為如此,new是保留字,不需要標頭檔案支援,malloc需要標頭檔案庫函式支援.2 new不止是分配記憶體,而且會呼叫類的建構函式,同理delete會呼...

C 中new和malloc的區別

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

C 中new和malloc的區別

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