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

MFC 環境下記憶體洩漏偵測與消除實戰技巧

     編輯:關於VC++

前言

記憶體洩漏是 C++ 開發中最常見也最隱蔽的問題。本文針對 VC++ 6.0 環境,系統介紹利用 CRT 偵錯堆函數偵測、定位並消除記憶體洩漏的完整流程與實戰技巧。

啟用 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,直接跳轉至原始碼。

情況二:僅有配置序號(無檔案資訊)

採用 試探法:

  1. 偵錯執行數次,記錄出現最頻繁的配置序號(如 {18})。
  2. 在程式啟動早期設定中斷點:_crtBreakAlloc = 18; 或 _CrtSetBreakAlloc(18);。
  3. 偵錯執行,程式中斷於第 18 次配置處。開啟「呼叫堆疊」視窗追溯原始碼。
  4. 退出程式觀察洩漏報告,若實際序號與設定一致則定位成功;否則調整序號重試。

VC++ 6.0 簡化作法

VC6 專案預設已整合 CRT 偵錯支援,無需手動加入標頭文件。直接 F5 偵錯執行,程式結束後查看「輸出視窗」。若出現 Detected memory leaks! 即存在洩漏。

消除洩漏

根據定位結果,在適當位置呼叫 delete / free 釋放記憶體。注意:

  • 陣列用 new[] 必須用 delete[] 釋放。
  • 智慧指標(auto_ptr、shared_ptr)可自動管理生命週期。
  • MFC 類別(CString、CArray 等)內部已處理記憶體,避免手動管理。

總結

「啟用偵錯堆 → 自動輸出報告 → 依報告定位(行號或試探法) → 釋放記憶體」是 VC++ 記憶體洩漏處理的標準流程。養成良好編碼習慣(RAII、智慧指標、容器類)才是從根源預防洩漏的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved