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

VC++ 記憶體洩漏偵測:_CrtDumpMemoryLeaks 與 DEBUG_NEW 完整指南

     編輯:關於C語言

VC++ Debug 執行期庫內建記憶體配置追蹤,程式結束時自動報告未釋放的 `new`/`malloc` 區塊,並標示配置原始碼檔案與行號 (需 `DEBUG_NEW`)。本文說明啟用方式、輸出解讀、常見洩漏模式與釋放策略。

啟用記憶體洩漏報告

在專案 `stdafx.h` 或主檔案最前端加入:


#ifdef _DEBUG
#define new DEBUG_NEW
#endif
  • `DEBUG_NEW` 記錄 `__FILE__`、`__LINE__` 至配置區塊頭部
  • 僅影響 `new` 運算子,`malloc` 需配合 `_CrtSetDbgFlag` 追蹤
  • 條件編譯確保 Release 版零開銷

自動報告輸出範例

Detected memory leaks!
Dumping objects ->
d:\proj\test.cpp(42) : {36} normal block at 0x00770520, 4 bytes long.
Data: < w > EC 02 77 00
d:\proj\test.cpp(41) : {35} normal block at 0x00770320, 100 bytes long.
Data: < > CD CD CD CD ...
{34} normal block at 0x007703B0, 200 bytes long.
Data: < > CD CD CD CD ...
Object dump complete.
  • 含檔案:行號:`new` 配置 (如 `{35}` `test.cpp(41)`)
  • 無檔案:行號:`malloc` 配置 (如 `{34}`)
  • 區塊編號 {n}:配置序號,可用 `_CrtSetBreakAlloc(n)` 設中斷點捕捉該配置點
  • Data:前 16 位元組內容 (十六進位 + ASCII),`CD` 為未初始化填充模式

進階控制 API

函數用途
`_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF)`啟用配置追蹤與結束時自動檢查 (預設已開啟)
`_CrtSetBreakAlloc(lAllocNum)`在指定區塊編號配置時中斷
`_CrtMemCheckpoint(&state)`記錄當前記憶體狀態快照
`_CrtMemDifference(&diff, &old, &new)`比較兩快照差異
`_CrtDumpMemoryLeaks()`手動觸發洩漏報告
`_CrtDoForAllClientObjects(fn, ctx)`枚舉所有用戶區塊呼叫回呼

常見洩漏模式與對策

  • 忘記 `delete`/`delete[]`:配對檢查,智慧指標 (`CComPtr`、`std::unique_ptr`) 自動管理
  • 例外導致流程跳過釋放:使用 RAII、智慧指標、`try`/`finally` (`__try`/`__finally`)
  • 循環參考 (COM/共享指標):`AddRef`/`Release` 不平衡,弱引用打破循環
  • DLL 邊界跨模組配置/釋放:同一模組 `new`/`delete`,或提供 `Free` 函數
  • 靜態/全域物件析構順序:避免跨模組依賴,使用 `atexit` 登記清理

實務建議

  1. 每次 Debug 執行結束檢查「輸出」視窗是否有 Detected memory leaks!
  2. 發現洩漏立即定位配置點 (`{n}` + 檔案:行號) 修復
  3. 長期運行服務程式定期呼叫 `_CrtMemCheckpoint`/`Difference` 監控成長趨勢
  4. 程式碼審查時重點檢查裸指標擁有權轉移
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved