狹義:堆內存洩漏(malloc/new 分配未 free/delete)。廣義:系統資源洩漏(HANDLE、GDI Object、SOCKET、COM Interface 等),更嚴重可導致系統不穩。
| 類型 | 特徵 | 示例 |
|---|---|---|
| 常發性 | 代碼路徑每次執行都洩漏 | 錯誤分支提前 return 未釋放 |
| 偶發性 | 特定環境/操作觸發 | 特定條件下 SelectObject 未恢復導致 GDI 洩漏 |
| 一次性 | 程序生命周期僅洩漏一次 | 單例構造分配、析構未釋放 |
| 隱式 | 運行中持續分配、僅退出時釋放 | 服務端連接管理未及時清理斷開連接對象 |
攔截分配/釋放函數,記錄每塊內存生命周期:分配時加入全局鏈表,釋放時移除。程序結束時鏈表剩餘即洩漏塊。同理可擴展至各類資源(SysAllocString/FreeString、CreateMenu/DestroyMenu 等)。
| 工具 | 原理 | 優點 | 缺點 |
|---|---|---|---|
| MS CRT Debug | Debug 版 malloc/free/new/delete 內建攔截,_CrtSetDbgFlag 啟用 | 免費、無需修改代碼(MFC 自動支持)、輸出文件行號 | 僅堆內存、需源碼配合(DEBUG_NEW)、無法檢測系統資源 |
| BoundsChecker | Code Injection:DLL 注入修改目標進程 IAT/代碼攔截 API,讀取 PDB 定位源碼與調用棧 | 功能全(參數校驗、越界、洩漏)、無需改源碼、顯示完整調用棧、穩定 | 商業收費、記錄調用棧極慢(默認關閉)、隱式洩漏無能為力 |
| Performance Monitor | 監控進程 Handle Count、Virtual Bytes、Working Set 計數器 | 能發現隱式洩漏(計數器持續增長)、系統級視角 | 無法定位代碼行、需結合邏輯分析猜測驗證 |
Settings → Error Detection → Custom → Category: Pointer and leak error check → 勾選 Report Call Stack。