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

VC++ 啟用 CRT 偵錯堆檢測記憶體洩漏完整指南

     編輯:VC 教學

啟用步驟 (標頭檔順序嚴格)

#define _CRTDBG_MAP_ALLOC     // 必須最前,映射 malloc/free 至 _malloc_dbg/_free_dbg
#include 
#include            // 定義 _CrtDumpMemoryLeaks 等

僅在 _DEBUG 定義時生效 (Debug 版)。Release 版不受影響。

基本用法

// 程式結束前手動呼叫
_CrtDumpMemoryLeaks();

輸出範例:

Detected memory leaks!
Dumping objects ->
{145} normal block at 0x00A4B8C0, 64 bytes long.
Data: < CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD >
Object dump complete.

若定義 _CRTDBG_MAP_ALLOC,輸出額外包含 **檔案名與行號**:leaktest.cpp(20)。

自動檢測 (無需手動呼叫)

// 程式進入點 (如 CWinApp::InitInstance) 最早處
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

程式正常退出時自動呼叫 _CrtDumpMemoryLeaks。適用多出口程式。

進階控制

功能API說明
設定斷點於特定配置序號_CrtSetBreakAlloc(145)配合輸出的 {145} 斷點進入該配置點
標記記憶體區塊_CrtSetDbgFlag(_CRTDBG_CHECK_ALWAYS_DF)每次配置/釋放檢查堆完整性 (極慢)
改變報告輸出目的地_CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE) + _CrtSetReportFile(_CRT_ERROR, hFile)導向檔案而非輸出視窗
檢查特定指標狀態_CrtIsMemoryBlock(ptr, size, &reqNum, &filename, &lineno)取得配置序號、來源檔案行號
記憶體狀態統計_CrtMemCheckpoint(&state), _CrtMemDifference, _CrtMemDumpStatistics比較兩時間點記憶體狀態

常見誤區

  • 放在 stdafx.h 但順序錯誤:_CRTDBG_MAP_ALLOC 必須在 stdlib.h **之前**,crtdbg.h **之後**。
  • 以為能檢測 new/delete:crtdbg.h 已將 new/delete 映射至 _malloc_dbg/_free_dbg,**可檢測**。
  • 第三方庫洩漏誤報:若第三方靜態庫未啟用 Debug CRT,其洩漏不會被追蹤;動態庫各自有獨立堆。

最佳實踐流程

  1. 專案 stdafx.h 頂端加入三行啟用代碼。
  2. CWinApp::InitInstance 首行加 _CrtSetDbgFlag(...) 自動檢測。
  3. 洩漏報告出現 {配置序號} → 專案設定 → Debug → Program arguments 加 /heapcheck:145 (或代碼 _CrtSetBreakAlloc(145)) 重跑偵錯。
  4. 斷點命中處即為洩漏配置點,檢查對應 new 是否有配對 delete。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved