首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C++ 中 new 與 malloc 的本質區別深度解析

     編輯:C++ 入門

核心差異速覽

特性new / deletemalloc / free
性質C++ 運算符(關鍵字)C 標準庫函數
頭文件無需包含需 <cstdlib> 或 <stdlib.h>
構造/析構自動調用構造函數 / 析構函數僅分配/釋放原始內存,不調用
返回類型強類型指針(T*)void* 需強制轉換
失敗處理拋出 bad_alloc 異常返回 NULL
重載支持可重載 operator new不可重載
調試信息可定位具體文件行號無行號信息

為什麼 C++ 保留 malloc/free?

兼容 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 容器、迭代器、函數對象均設計為按值傳遞,正是因為它們輕量且無切片問題。

最佳實踐

  • C++ 代碼統一使用 new/delete,配合智能指針(unique_ptr/shared_ptr)自動管理生命週期。
  • 僅在對接 C 庫、需精確控制內存對齊/池化時使用 malloc/free。
  • 嚴禁混用:new[] 對應 delete[],malloc 對應 free。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved