記憶體洩漏是 C++ 開發中最常見也最隱蔽的問題。本文針對 VC++ 6.0 環境,系統介紹利用 CRT 偵錯堆函數偵測、定位並消除記憶體洩漏的完整流程與實戰技巧。
在程式碼最前端加入(順序不可變):
#define CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
此舉將 malloc/free 映射為 _malloc_dbg/_free_dbg,僅在 _DEBUG 定義時生效。定義 CRTDBG_MAP_ALLOC 可在洩漏報告中顯示檔案名與行號。
在程式結束處呼叫:
_CrtDumpMemoryLeaks();
或在程式啟動時設定自動檢查:
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
Detected memory leaks!
Dumping objects ->
C:\Project\test.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}:記憶體配置序號(每次執行可能不同)。normal block:區塊類型(normal/client/CRT)。0x00780E80:記憶體位址。64 bytes:區塊大小。test.cpp(20):配置發生的檔案與行號(需定義 CRTDBG_MAP_ALLOC)。在「輸出」視窗雙擊該行,或選中按 F4,直接跳轉至原始碼。
採用 試探法:
{18})。_crtBreakAlloc = 18; 或 _CrtSetBreakAlloc(18);。VC6 專案預設已整合 CRT 偵錯支援,無需手動加入標頭文件。直接 F5 偵錯執行,程式結束後查看「輸出視窗」。若出現 Detected memory leaks! 即存在洩漏。
根據定位結果,在適當位置呼叫 delete / free 釋放記憶體。注意:
new[] 必須用 delete[] 釋放。auto_ptr、shared_ptr)可自動管理生命週期。CString、CArray 等)內部已處理記憶體,避免手動管理。「啟用偵錯堆 → 自動輸出報告 → 依報告定位(行號或試探法) → 釋放記憶體」是 VC++ 記憶體洩漏處理的標準流程。養成良好編碼習慣(RAII、智慧指標、容器類)才是從根源預防洩漏的關鍵。