查了網上,說是使用CRT 除錯堆函式,在StdAfx.h檔案中添
#define _CRTDBG_MAP_ALLO
#include <crtdbg.h>
在每個函式的結尾添_CrtDumpMemoryLeaks();
在視窗生成彈出時就顯示記憶體泄露,最小化再打開也會重新提示泄露
c:\documents and settings\administrator\桌面\distanceview.cpp(32) : {727} client block at 0x01549DF8, subtype c0, 928 bytes long.
a CDistanceView object at $01549DF8, 928 bytes long
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {723} normal block at 0x01549BD0, 25 bytes long.
Data: <T y > 54 CD 07 79 08 00 00 00 08 00 00 00 01 00 00 00
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {722} normal block at 0x01549B78, 25 bytes long.
Data: <T y > 54 CD 07 79 08 00 00 00 08 00 00 00 01 00 00 00
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {721} normal block at 0x01549AF0, 69 bytes long.
Data: <T y4 4 > 54 CD 07 79 34 00 00 00 34 00 00 00 01 00 00 00
指向IMPLEMENT_DYNCREATE(CDistanceView, CFormView)
c:\documents and settings\administrator\桌面\mainfrm.cpp(18) : {720} client block at 0x01549808, subtype c0, 680 bytes long.
a CMainFrame object at $01549808, 680 bytes long
指向IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
c:\documents and settings\administrator\桌面\定性4.7連續\distancedoc.cpp(18) : {719} client block at 0x015496E0, subtype c0, 236 bytes long.
a CDistanceDoc object at $015496E0, 236 bytes long
指向IMPLEMENT_DYNCREATE(CDistanceDoc, CDocument)
c:\documents and settings\administrator\桌面\定性4.7連續\distance.cpp(76) : {715} client block at 0x01549478, subtype c0, 140 bytes long.
a CSingleDocTemplate object at $01549478, 140 bytes long
指向 pDocTemplate = new CSingleDocTemplate(
還有很多是f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\***********開頭的
第一次查記憶體泄漏,有很多東西都不清楚。之后應該怎么判斷哪里泄露了?
uj5u.com熱心網友回復:
在每條函式都加_CrtDumpMemoryLeaks不是作死么,在程式結束的時候加啊,_CrtDumpMemoryLeaks就是對比快照檢查哪些記憶體沒有內釋放,我們一般說的記憶體泄漏是沒有釋放掉不再使用的記憶體,
運行中肯定有些沒有釋放,但是依然在使用啊
uj5u.com熱心網友回復:
MFC已經自帶了記憶體泄漏檢測功能了,可以試一試uj5u.com熱心網友回復:
那在MFC哪里呼叫?有搜到:
一般用在MFC中比較準確,在InitInstance里面呼叫_CrtDumpMemoryLeaks
這對么?
uj5u.com熱心網友回復:
在 ExitInstance() 用了_CrtDumpMemoryLeaks(),用_CrtSetBreakAlloc()來使程式中斷。
查看 呼叫堆疊,看到:

這要怎么看?
但是,也有一部分是不會中斷的,例如58,這可能是什么原因?
uj5u.com熱心網友回復:
你先找到提示的代碼行數,一層層到你的代碼,然后看對應的代碼處是否有可疑uj5u.com熱心網友回復:
我以前用的是VLD工具檢查記憶體泄漏,其實還有很多工具用這個工具的好處就是雙擊記憶體泄漏的提示 就會定位到代碼行~~~~
uj5u.com熱心網友回復:
Shift+F11?
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/147975.html
標籤:基礎類
