malloc與new的9點差別:
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沒有這樣隻管的配套設施來擴充記憶體。
總結:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiclRnblN0LclHdpZXYyd2LcBzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX90zdNhXWE1UMFRUT5tmblZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39zNxMzMxEDMxEzMxETM3EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)