1. 程式人生 > >【C++】new和malloc的區別

【C++】new和malloc的區別

     之前的部落格中也有寫過new和malloc但是沒有系統的整理過。因為最近看面經經常會碰到面試官會問new和mmalloc的區別,所以在這裡整理一下,希望對大家有幫助。

new和malloc的區別可以從以下幾方面進行闡述:

  • 最大的區別:new在申請空間的時候會呼叫建構函式,malloc不會呼叫

  • 申請失敗返回:new在申請空間失敗後返回的是錯誤碼bad_alloc,malloc在申請空間失敗後會返回NULL

  • 屬性上:new/delete是C++關鍵字需要編譯器支援,maollc是庫函式,需要新增標頭檔案

  • 引數:new在申請記憶體分配時不需要指定記憶體塊大小,編譯器會更具型別計算出大小,malloc需要顯示的指定所需記憶體的大小

  • 成功返回型別:new操作符申請記憶體成功時,返回的是物件型別的指標,型別嚴格與物件匹配,無需進行型別轉換,因此new是型別安全性操作符。malloc申請記憶體成功則返回void*,需要強制型別轉換為我們所需的型別

  • 自定義型別:new會先調operator new函式,申請足夠的記憶體(底層也是malloc實現),然後呼叫類的建構函式,初始化成員變數,最後返回自定義型別指標。delete先呼叫解構函式,然後呼叫operator delete函式來釋放記憶體(底層是通過free實現)。malloc/free是庫函式,只能動態的申請和釋放記憶體,無法強制要求其做自定義型別物件構造和解構函式

  • 過載:C++允許過載new/delete操作符,特別的,佈局new的就不需要為物件分配記憶體,而是指定了一個地址作為記憶體起始區域,new在這段記憶體上為物件呼叫建構函式完成初始化工作,並返回地址。malloc不允許過載。