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

Windows 記憶體分配全攻略:從 Heap 到 Virtual Memory 與除錯技巧

     編輯:關於C語言

四大記憶體分配 API 體系

在 Win32/MFC 開發中,可選擇四種層級的記憶體管理 API,各有適用場景:

1. Win32 Heap API(推薦通用首選)

每個行程擁有預設堆疊,亦可建立私有堆疊(HeapCreate)。特點:

  • HeapAlloc 分配固定位址、不可移動記憶體。
  • 支援細粒度大小分配,效能優於 VirtualAlloc。
  • HeapFree/HeapDestroy 釋放/銷毀。

2. Global/Local API(僅為相容性保留)

Win32 平坦記憶體模型下 GlobalAlloc 與 LocalAlloc 行為一致。僅為 16 位元程式移植保留,新開發不建議使用。

3. C 執行期庫(CRT)函式

  • malloc/free、calloc、realloc 等標準函式。
  • 底層映射至 Heap API,分配記憶體同樣不可移動。
  • 除錯版本: malloc_dbg 等支援記憶體洩漏偵測、緩衝區覆寫檢查、分配堆疊追蹤。

4. Virtual Memory API(底層、大塊、特殊需求)

以 4KB 頁為單位,直接操作位址空間:

  • VirtualAlloc/VirtualFree:保留/認交記憶體區域,支援 MEM_RESERVE(保留位址空間不佔實體頁)、MEM_COMMIT(認交實體頁)、PAGE_READWRITE 等保護屬性。
  • VirtualProtect:動態改變頁面存取保護(如實現 JIT 編譯、守衛頁)。
  • VirtualQuery:查詢位址區域狀態(免費/保留/認交、保護屬性、類型)。
  • VirtualLock/VirtualUnlock:鎖定頁面於實體記憶體,防止分頁至磁碟(需特權)。

C++ new/delete 與 MFC 除錯支援

MFC 在 Debug 版重載 new 運算子,自動記錄檔案名、行號、分配序號,配合 CMemoryState 差異比較,可精準定位記憶體洩漏:

CMemoryState oldMem, newMem, diffMem;
oldMem.Checkpoint();
// ... 執行測試程式碼 ...
newMem.Checkpoint();
if (diffMem.Difference(oldMem, newMem))
    diffMem.DumpStatistics(); // 輸出洩漏統計

選擇指南

需求推薦 API
一般物件/小塊記憶體CRT malloc/new 或 HeapAlloc (預設堆疊)
大量/大塊/需位址對齊/保護屬性控制VirtualAlloc
頻繁分配釋放固定大小結構私有堆疊 HeapCreate + HeapAlloc 或 Lookaside List
跨 DLL 邊界傳遞記憶體共用 CRT 版本或使用 COM 記憶體分配器 CoTaskMemAlloc
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved