/**便於遺忘時複習**/安全
區別一:本質函數
new/delete 在C++中是運算符不是函數,須要編譯器支持。malloc/free是庫函數,須要頭文件支持,在C語言中使用。佈局
區別二:開闢內存大小操作系統
用 new 操做符申請內存分配時無須指定內存塊的大小,編譯器會根據提供的類型信息自行計算。而malloc則須要先計算出所需內存的尺寸。指針
new 能夠直接分配快內存,用[ ]操做;malloc 在分配快內存時,須要先把快內存的大小計算出來,而後分配;對象
區別三:返回類型blog
new操做符內存分配成功時,返回的是提供的對象類型的指針,類型嚴格與對象匹配,無須進行類型轉換,故new是符合類型安全性的操做符。內存
而malloc內存分配成功則是返回void * ,須要經過強制類型轉換將void*指針轉換成咱們須要的類型。編譯器
區別四:分配失敗編譯
new內存分配失敗時,會拋出bac_alloc異常。malloc分配內存失敗時返回NULL。
區別五:自定義類型
new會先調用operator new函數,申請足夠的內存(一般底層使用malloc實現)。而後調用類型的構造函數,初始化成員變量,最後返回自定義類型指針。delete先調用析構函數,而後調用operator delete函數釋放內存(一般底層使用free實現)。
malloc/free是庫函數,只能動態的申請和釋放內存,沒法強制要求其作自定義類型對象構造和析構工做。
區別六:重載
C++容許重載new/delete操做符,特別的,佈局new的就不須要爲對象分配內存,而是指定了一個地址做爲內存起始區域,new在這段內存上爲對象調用構造函數完成初始化工做,並返回此地址。而malloc不容許重載。
區別七:內存區域
new操做符從自由存儲區上爲對象動態分配內存空間,而malloc函數從堆上動態分配內存。自由存儲區是C++基於new操做符的一個抽象概念,凡是經過new操做符進行內存申請,該內存即爲自由存儲區。而堆是操做系統中的術語,是操做系統所維護的一塊特殊內存,用於程序的內存動態分配,C語言使用malloc從堆上分配內存,使用free釋放已分配的對應內存。自由存儲區不等於堆,如上所述,佈局new就能夠不位於堆中。
總結: