C/C++ 手動記憶體管理雖靈活但極易洩漏。Visual C++ CRT Debug Heap 提供強大的內建洩漏偵測工具,零第三方依賴,本文系統介紹啟用方法、報告解讀、自動檢測、分配編號斷點定位、記憶體區塊類型區分、報告輸出重導向等完整技能。
// 必須在所有標頭之前,且順序固定
#define _CRTDBG_MAP_ALLOC // 映射 malloc/free 到 _malloc_dbg/_free_dbg
#include
#include // 提供 _CrtDumpMemoryLeaks 等
_DEBUG),Release 版仍用標準 malloc/free。_CRTDBG_MAP_ALLOC 讓洩漏報告包含 檔案名與行號,極其關鍵。int main() {
// ... 程式邏輯 ...
_CrtDumpMemoryLeaks(); // 程式結束前呼叫
return 0;
}
輸出至 Output 視窗 -> Debug 標籤。
int main() {
// 程式一開始設定:退出時自動呼叫 _CrtDumpMemoryLeaks
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
// ...
}
適用於多出口函數、異常退出等場景,無需在每個 return 處理。
Detected memory leaks!
Dumping objects ->
c:\projects\leaktest.cpp(20) : {18} normal block at 0x00780E80, 64 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
{18}:分配編號 (第 18 次分配)。normal block:區塊類型 (見下表)。0x00780E80:位址。64 bytes:大小。c:\projects\leaktest.cpp(20):分配源碼位置 (需 _CRTDBG_MAP_ALLOC)。Data:前 16 字節內容 (十六進位),CD = 未初始化填充模式。| 類型 | 含義 | 關注度 |
|---|---|---|
| Normal block | 程式碼 malloc/new 分配 | ★★★ 主要排查目標 |
| Client block | MFC 物件 (如 CString, CArray) 未釋放 | ★★ 檢查物件生命週期 |
| CRT block | CRT 內部自用 | ★ 通常忽略,除非 CRT 崩潰 |
| Free block | 已釋放 | 不出現在洩漏報告 |
| Ignore block | 開發者標記忽略 (_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF | _CRTDBG_DELAY_FREE_MEM_DF) 等) | 刻意排除 |