Visual C++ 調試輸出顯示內存洩露,堆棧指向 MFC 內部對話框創建代碼。本文說明如何定位業務代碼中的洩露源頭。
Detected memory leaks!
Dumping objects ->
{123} normal block at 0x00ABCDEF, 48 bytes long.
Data: <...> CD CD CD CD ...
Object dump complete.
堆棧多為 CDialog::DoModal、CWnd::CreateDlgIndirect 等 MFC 內部框架代碼。
OnInitDialog / 構造函數中分配的資源:
new 出來的對象是否在 OnDestroy/析構函數中 deleteDeleteObject/ReleaseDCMyDialog dlg;
if (dlg.DoModal() == IDOK) {
// 處理數據
}
// dlg 此處離開作用域自動析構,但成員指針指向的堆內存需手動釋放
#define _CRTDBG_MAP_ALLOC
#include
#include
// 程序入口處
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
// 某次可疑分配斷點
// _CrtSetBreakAlloc(123); // 分配序號
| 代碼模式 | 修正 |
|---|---|
CBrush* p = new CBrush(...); 無 delete | 用 CBrush brush(...) 棧對象,或析構刪除 |
CDC* pDC = new CDC(); 無 delete pDC | 用 CClientDC dc(this) 棧對象 |
動態創建控件 new CButton() 無父窗口管理 | 父窗口銷毀時自動銷毀子窗口,或手動 DestroyWindow |
內存洩露雖報在框架,根因在業務。善用 _CrtSetBreakAlloc 定位分配點,對症下藥。