1. 程式人生 > >淺談 malloc/free 和 new/delete

淺談 malloc/free 和 new/delete

malloc 和 free 是 C 語言中的函式,也可以用在 C++ 中,但在 C++ 中卻視為不安全的記憶體操作。而 new 和 delete 是 C++ 中的兩個運算子,完全可以替代 malloc/free 完成記憶體的操作,且為安全的記憶體操作。在C++ 中保留 malloc/free 是為了和 C 語言保持相容,因此在 C++ 中儘量使用 new/delete。它們的區別有以下幾點:

  1. malloc / free 為 C/C++ 標準庫函式,而 new/delete 為 C++中的運算子。

  2. new 建立的物件有型別,而 malloc 返回 void* 型別,需要強制轉換為指定的型別。

  3. new 時會根據制定型別自動計算大小且會呼叫物件的建構函式完成初始化,而 malloc 只分配指定大小的記憶體,不進行初始化,其值是隨機的。delete 時自動呼叫物件解構函式,而 free 不會。

  4. new 失敗時,會呼叫 new_handler 處理函式,而 malloc 失敗緊返回 NULL,不做善後處理,因此往往需要檢查分配是否成功。

int *a = new int[5];
int *b = (int *)malloc(5*sizeof(int));

new 的三種形態:new operator,operator new,placement new。

new operator(new運算子)的執行過程:

  • 通過 operator new 分配記憶體,預設呼叫 malloc 分配記憶體,可過載 operator new 函式;
void *operator new
(size_t size);
  • 使用 placement new 呼叫物件建構函式(內部簡單型別(如 int)忽略此步);

  • 返回記憶體指標。