面試題:malloc和new的區別

參考:動態內存分配、malloc與new的區別
經典面試題之new和malloc的區別

  1. 屬性:
malloc/free是標準庫函數,new/delete是C++運算符
  1. 分配內存的位置:
malloc從堆上分配內存,
new從自由存儲區(堆/靜態存儲區,位置取決於operator new)爲對象分配內存。
  1. 返回類型安全性:
malloc分配成功後返回void*,然後再強制轉換爲需要的類型;
new操作符分配成功後返回與對象類型相匹配的指針類型,因此new是類型安全的。
  1. 內存分配失敗返回值:
malloc分配失敗後返回NULL,new分配失敗拋出異常bac_alloc。
  1. 分配內存大小:
使用new操作符申請內存分配時無須指定內存塊的大小,編譯器會根據類型信息自行計算,
而malloc則需要顯式地指出所需內存的尺寸。
  1. 自定義類型:
new會先調用operator new函數,申請足夠的內存(通常底層使用malloc實現)。
然後調用類型的構造函數,初始化成員變量,最後返回自定義類型指針。
delete先調用析構函數,然後調用operator delete函數釋放內存(通常底層使用free實現)。
malloc/free是庫函數,只能動態的申請和釋放內存,無法強制要求其做自定義類型對象構造和析構工作。
  1. 是否可以被重載:
C++允許重載new/delete操作符,
特別的,佈局new的就不需要爲對象分配內存,而是指定了一個地址作爲內存起始區域,new在這段內存上爲對象調用構造函數完成初始化工作,並返回此地址。
而malloc不允許重載。
  1. 分配內存時內存不足:
malloc動態分配內存後,如果不夠用可以使用realloc函數重新分配實現內存的擴充;
而new則沒有這樣的操作。
  1. 是否可以相互調用:
operator new /operator delete的實現可以基於malloc,
而malloc的實現不可以去調用new。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章