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

C/C++ 記憶體管理:new/delete vs malloc/free 深度對比

     編輯:關於C++

雖然 new/delete 與 malloc/free 都能動態分配/釋放記憶體,但它們屬於完全不同的語言層級,混用會導致嚴重錯誤。

核心差異速查表

維度new / deletemalloc / free
性質C++ 運算子(可重載)C 標準庫函式
頭文件無需(關鍵字)<cstdlib> / <stdlib.h>
建構/解構自動呼叫不呼叫(僅原始記憶體)
型別安全回傳具型別指標回傳 void* 需強制轉型
失敗處理拋出 std::bad_alloc返回 NULL
陣列支援new T[n]/delete[]手動計算 n * sizeof(T)
自定義分配運算子重載、placement new自訂分配器函式

為什麼 C++ 需要 new/delete?

非 POD 型別(含建構/解構函數的類別)必須在記憶體上執行建構/解構邏輯。malloc 只是原始位元組塊,編譯器無法注入建構/解構呼叫。new 內部封裝:

T* p = static_cast<T*>(operator new(sizeof(T))); // 分配
new (p) T(args...);                              // placement new 呼叫建構函數

delete 對稱:呼叫解構函數 → operator delete(p) 釋放記憶體。

致命陷阱:混用導致未定義行為

  • malloc 分配 → delete 釋放:不呼叫解構函數,釋放函數簽名不匹配(operator delete vs free),堆損壞。
  • new 分配 → free 釋放:不呼叫解構函數,同樣導致堆損壞。
  • new T[n] → free / delete(非陣列版):解構次數錯誤、Cookie 損壞。

鐵律:new 配 delete,new[] 配 delete[],malloc 配 free,三組不可交叉。

C/C++ 混合專案的正確做法

  • C++ 代碼管理 C++ 物件:全程 new/delete 或智慧指標/容器。
  • C API 分配的記憶體:由同一 C API 提供的釋放函式釋放(如 xmlFree、sqlite3_free)。
  • C++ 封裝 C 記憶體:用 std::unique_ptr<T, Deleter> 自定義刪除器。
  • 需與 C 共享記憶體區塊:雙方約定用 malloc/free,C++ 端用 placement new 建構物件,釋放前手動呼叫解構函數再 free。

現代 C++ 建議

  1. 幾乎不直接寫 new/delete:用 std::make_unique、std::make_shared、std::vector、std::string。
  2. 自定義記憶體策略:重載 operator new/delete 或提供 std::pmr::memory_resource(C++17)。
  3. Placement new 僅用於預先分配的緩衝區(物件池、共享記憶體、嵌入式系統)。

總結

new/delete 是 C++ 型別系統的一部分,語意包含「分配+建構」與「解構+釋放」;
malloc/free 是 C 原始記憶體操作,無型別、無語意。
現代 C++ 開發者應將 malloc/free 視為「底層基礎設施」,僅在與 C 互操作或實作分配器時接觸。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved