| 特性 | new / delete | malloc / free |
|---|---|---|
| 性質 | C++ 運算符(關鍵字) | C 標準庫函數 |
| 頭文件 | 無需包含 | 需 <cstdlib> 或 <stdlib.h> |
| 構造/析構 | 自動調用構造函數 / 析構函數 | 僅分配/釋放原始內存,不調用 |
| 返回類型 | 強類型指針(T*) | void* 需強制轉換 |
| 失敗處理 | 拋出 bad_alloc 異常 | 返回 NULL |
| 重載支持 | 可重載 operator new | 不可重載 |
| 調試信息 | 可定位具體文件行號 | 無行號信息 |
兼容 C 庫:C++ 程序常調用 C 函數,C 函數內部只能用 malloc/free 管理內存。混用會導致未定義行為(如 free(new T) 漏調析構函數,delete malloc() 可讀性差)。
operator new 通常以 malloc 為底層分配器,再調用構造函數;operator delete 調用析構函數後再 free。但兩者不保證一定如此,切勿依賴此實現細節。
class Obj {
public:
Obj() { cout << "Constructor\n"; }
~Obj() { cout << "Destructor\n"; }
};
// 錯誤:malloc 不調用構造函數
Obj* p = (Obj*)malloc(sizeof(Obj));
// 正確
Obj* p = new Obj;
delete p; // 自動調用 ~Obj()
「new 慢於 malloc」是片面的:new 包含分配+構造,malloc 僅分配。對於 POD 類型(int、struct 無構造函數),編譯器優化後兩者機器碼幾乎一致。STL 容器、迭代器、函數對象均設計為按值傳遞,正是因為它們輕量且無切片問題。
unique_ptr/shared_ptr)自動管理生命週期。new[] 對應 delete[],malloc 對應 free。