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...