在 Win32/MFC 開發中,可選擇四種層級的記憶體管理 API,各有適用場景:
每個行程擁有預設堆疊,亦可建立私有堆疊(HeapCreate)。特點:
HeapAlloc 分配固定位址、不可移動記憶體。HeapFree/HeapDestroy 釋放/銷毀。Win32 平坦記憶體模型下 GlobalAlloc 與 LocalAlloc 行為一致。僅為 16 位元程式移植保留,新開發不建議使用。
malloc/free、calloc、realloc 等標準函式。malloc_dbg 等支援記憶體洩漏偵測、緩衝區覆寫檢查、分配堆疊追蹤。以 4KB 頁為單位,直接操作位址空間:
VirtualAlloc/VirtualFree:保留/認交記憶體區域,支援 MEM_RESERVE(保留位址空間不佔實體頁)、MEM_COMMIT(認交實體頁)、PAGE_READWRITE 等保護屬性。VirtualProtect:動態改變頁面存取保護(如實現 JIT 編譯、守衛頁)。VirtualQuery:查詢位址區域狀態(免費/保留/認交、保護屬性、類型)。VirtualLock/VirtualUnlock:鎖定頁面於實體記憶體,防止分頁至磁碟(需特權)。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 |