首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ 記憶體管理深度解析:malloc/free vs new/delete 底層原理

     編輯:程式設計綜合問答

核心差異

特性malloc / freenew / delete
性質C 標準庫函式C++ 運算子(可重載)
建構/解構**不呼叫** 建構函式/解構函式**自動呼叫** 建構函式/解構函式
型別安全回傳 void* 需強轉回傳精確型別指標
失敗處理回傳 NULL拋 std::bad_alloc 例外
陣列支援手動計算總大小new T[n] / delete[] 自動管理元素個數

底層實現關聯

  • 全域 operator new(size_t) **通常內部呼叫 malloc** 分配原始記憶體,再呼叫建構函式。
  • operator delete 呼叫解構函式後 **內部呼叫 free** 釋放記憶體。
  • 因此 malloc 記憶體**不可**用 delete 釋放(缺少解構),new 記憶體**不可**用 free 釋放(缺少解構且記憶體頭部資訊可能不同)。

陣列 new/delete 內部機制

  • new T[100]:分配 sizeof(T)*100 + 額外空間(存元素個數),回傳指向首元素的指標。
  • delete[] ptr:從指標前端讀取元素個數,**逆序呼叫 100 次解構函式**,最後釋放整塊記憶體。
  • 嚴禁 new T[100] 搭配 delete ptr(僅呼叫 1 次解構函式 → 記憶體洩漏/未定義行為)。

堆的本質

作業系統提供的虛擬記憶體區域,C 執行期庫(CRT)維護**自由塊鏈表/紅黑樹/分級分配器**(如 ptmalloc、jemalloc、tcmalloc)管理已分配/未分配區塊,malloc/free 實際操作這些資料結構。

深度閱讀

推薦文章:new/delete/malloc/free 內存原理深度剖析

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