|
下載地址:http://vld.codeplex.com/
安裝這個工具后添加上它的的include和lib目錄即可,然后比如在stdafx.h中
#inclide<vld.h>
即可。。。。
在Debug運(yùn)行后,在“輸出”窗口就會出現(xiàn)下面這樣的提示,定義出了泄露內(nèi)存的地方。。。
WARNING: Visual Leak Detector detected memory leaks!
---------- Block 128546 at 0x02059550: 8 bytes ----------
Call Stack:
f:\medical\medical\imgprocessdlg.cpp (773): Medical.exe!CImgProcessDlg::SaveCurrentToUndo + 0x7 bytes
f:\medical\medical\imgprocessdlg.cpp (193): Medical.exe!RunImageToolsThread
0x7C80B729 (File and line number not available): kernel32.dll!GetModuleFileNameA + 0x1BA bytes
Data:
D8 6F 5B 01 CD CD CD CD .o[..... ........
---------- Block 92549 at 0x02059898: 8 bytes ----------
Call Stack:
f:\medical\medical\imgprocessdlg.cpp (773): Medical.exe!CImgProcessDlg::SaveCurrentToUndo + 0x7 bytes
f:\medical\medical\imgprocessdlg.cpp (193): Medical.exe!RunImageToolsThread
0x7C80B729 (File and line number not available): kernel32.dll!GetModuleFileNameA + 0x1BA bytes
Data:
08 2D 5B 01 CD CD CD CD .-[..... ........
---------- Block 96150 at 0x020598E0: 8 bytes ----------
Call Stack:
f:\medical\medical\imgprocessdlg.cpp (773): Medical.exe!CImgProcessDlg::SaveCurrentToUndo + 0x7 bytes
f:\medical\medical\imgprocessdlg.cpp (193): Medical.exe!RunImageToolsThread
0x7C80B729 (File and line number not available): kernel32.dll!GetModuleFileNameA + 0x1BA bytes
Data:
08 E0 81 04 CD CD CD CD ........ ........
---------- Block 121344 at 0x02059A08: 8 bytes ----------
Call Stack:
f:\medical\medical\imgprocessdlg.cpp (773): Medical.exe!CImgProcessDlg::SaveCurrentToUndo + 0x7 bytes
f:\medical\medical\imgprocessdlg.cpp (193): Medical.exe!RunImageToolsThread
0x7C80B729 (File and line number not available): kernel32.dll!GetModuleFileNameA + 0x1BA bytes
Data:
08 95 77 04 CD CD CD CD ..w..... ........
---------- Block 132149 at 0x02059E60: 8 bytes ----------
Call Stack:
f:\medical\medical\imgprocessdlg.cpp (773): Medical.exe!CImgProcessDlg::SaveCurrentToUndo + 0x7 bytes
f:\medical\medical\imgprocessdlg.cpp (193): Medical.exe!RunImageToolsThread
0x7C80B729 (File and line number not available): kernel32.dll!GetModuleFileNameA + 0x1BA bytes
Data:
B8 4F 7F 04 CD CD CD CD .O...... ........
---------- Block 96149 at 0x0205C1A0: 8 bytes ----------
Call Stack:
f:\medical\medical\imgprocessdlg.cpp (773): Medical.exe!CImgProcessDlg::SaveCurrentToUndo + 0x7 bytes
f:\medical\medical\imgprocessdlg.cpp (193): Medical.exe!RunImageToolsThread
0x7C80B729 (File and line number not available): kernel32.dll!GetModuleFileNameA + 0x1BA bytes
Data:
68 93 77 04 CD CD CD CD h.w..... ........
---------- Block 128547 at 0x0205CB28: 8 bytes ----------
Call Stack:
f:\medical\medical\imgprocessdlg.cpp (773): Medical.exe!CImgProcessDlg::SaveCurrentToUndo + 0x7 bytes
f:\medical\medical\imgprocessdlg.cpp (193): Medical.exe!RunImageToolsThread
0x7C80B729 (File and line number not available): kernel32.dll!GetModuleFileNameA + 0x1BA bytes
Data:
68 4E 7F 04 CD CD CD CD hN...... ........
---------- Block 124945 at 0x0205CBC8: 8 bytes ----------
Call Stack:
f:\medical\medical\imgprocessdlg.cpp (773): Medical.exe!CImgProcessDlg::SaveCurrentToUndo + 0x7 bytes
f:\medical\medical\imgprocessdlg.cpp (193): Medical.exe!RunImageToolsThread
0x7C80B729 (File and line number not available): kernel32.dll!GetModuleFileNameA + 0x1BA bytes
Data:
40 94 77 04 CD CD CD CD @.w..... ........
---------- Block 92546 at 0x0205FC88: 8 bytes ----------
Call Stack:
f:\medical\medical\imgprocessdlg.cpp (773): Medical.exe!CImgProcessDlg::SaveCurrentToUndo + 0x7 bytes
f:\medical\medical\imgprocessdlg.cpp (193): Medical.exe!RunImageToolsThread
0x7C80B729 (File and line number not available): kernel32.dll!GetModuleFileNameA + 0x1BA bytes
Data:
88 95 77 04 CD CD CD CD ..w..... ........
---------- Block 298054 at 0x0205FF10: 8 bytes ----------
Call Stack:
f:\medical\medical\imgprocessdlg.cpp (773): Medical.exe!CImgProcessDlg::SaveCurrentToUndo + 0x7 bytes
f:\medical\medical\imgprocessdlg.cpp (193): Medical.exe!RunImageToolsThread
0x7C80B729 (File and line number not available): kernel32.dll!GetModuleFileNameA + 0x1BA bytes
Data:
B8 94 77 04 CD CD CD CD ..w..... ........
---------- Block 135750 at 0x04030A68: 8 bytes ----------
Call Stack:
f:\medical\medical\imgprocessdlg.cpp (773): Medical.exe!CImgProcessDlg::SaveCurrentToUndo + 0x7 bytes
f:\medical\medical\imgprocessdlg.cpp (193): Medical.exe!RunImageToolsThread
0x7C80B729 (File and line number not available): kernel32.dll!GetModuleFileNameA + 0x1BA bytes
Data:
18 91 AE 04 CD CD CD CD ........ ........
---------- Block 135752 at 0x0403D3F8: 8 bytes ----------
Call Stack:
f:\medical\medical\imgprocessdlg.cpp (773): Medical.exe!CImgProcessDlg::SaveCurrentToUndo + 0x7 bytes
f:\medical\medical\imgprocessdlg.cpp (193): Medical.exe!RunImageToolsThread
0x7C80B729 (File and line number not available): kernel32.dll!GetModuleFileNameA + 0x1BA bytes
Data:
C0 91 AE 04 CD CD CD CD ........ ........
---------- Block 124946 at 0x04040300: 8 bytes ----------
Call Stack:
f:\medical\medical\imgprocessdlg.cpp (773): Medical.exe!CImgProcessDlg::SaveCurrentToUndo + 0x7 bytes
f:\medical\medical\imgprocessdlg.cpp (193): Medical.exe!RunImageToolsThread
0x7C80B729 (File and line number not available): kernel32.dll!GetModuleFileNameA + 0x1BA bytes
Data:
30 6F 5B 01 CD CD CD CD 0o[..... ........
---------- Block 128549 at 0x04040620: 8 bytes ----------
Call Stack:
f:\medical\medical\imgprocessdlg.cpp (773): Medical.exe!CImgProcessDlg::SaveCurrentToUndo + 0x7 bytes
f:\medical\medical\imgprocessdlg.cpp (193): Medical.exe!RunImageToolsThread
0x7C80B729 (File and line number not available): kernel32.dll!GetModuleFileNameA + 0x1BA bytes
Data:
10 4F 7F 04 CD CD CD CD .O...... ........
---------- Block 135749 at 0x04040D50: 8 bytes ----------
Call Stack:
f:\medical\medical\imgprocessdlg.cpp (773): Medical.exe!CImgProcessDlg::SaveCurrentToUndo + 0x7 bytes
f:\medical\medical\imgprocessdlg.cpp (193): Medical.exe!RunImageToolsThread
0x7C80B729 (File and line number not available): kernel32.dll!GetModuleFileNameA + 0x1BA bytes
Data:
70 90 AE 04 CD CD CD CD p....... ........
Visual Leak Detector detected 15 memory leaks (660 bytes).
Largest number used: 930882 bytes.
Total allocations: 40291554 bytes.
Visual Leak Detector is now exiting.
Detected memory leaks!
Dumping objects ->
{301788} normal block at 0x0205FF10, 8 bytes long.
Data: < w > B8 94 77 04 CD CD CD CD
{139037} normal block at 0x0403D3F8, 8 bytes long.
Data: < > C0 91 AE 04 CD CD CD CD
{139025} normal block at 0x04030A68, 8 bytes long.
Data: < > 18 91 AE 04 CD CD CD CD
{139015} normal block at 0x04040D50, 8 bytes long.
Data: <p > 70 90 AE 04 CD CD CD CD
{135401} normal block at 0x02059E60, 8 bytes long.
Data: < O > B8 4F 7F 04 CD CD CD CD
{131787} normal block at 0x04040620, 8 bytes long.
Data: < O > 10 4F 7F 04 CD CD CD CD
{131775} normal block at 0x0205CB28, 8 bytes long.
Data: <hN > 68 4E 7F 04 CD CD CD CD
{131765} normal block at 0x02059550, 8 bytes long.
Data: < o[ > D8 6F 5B 01 CD CD CD CD
{128151} normal block at 0x04040300, 8 bytes long.
Data: <0o[ > 30 6F 5B 01 CD CD CD CD
{128140} normal block at 0x0205CBC8, 8 bytes long.
Data: <@ w > 40 94 77 04 CD CD CD CD
{124526} normal block at 0x02059A08, 8 bytes long.
Data: < w > 08 95 77 04 CD CD CD CD
{99272} normal block at 0x020598E0, 8 bytes long.
Data: < > 08 E0 81 04 CD CD CD CD
{99260} normal block at 0x0205C1A0, 8 bytes long.
Data: <h w > 68 93 77 04 CD CD CD CD
{95645} normal block at 0x02059898, 8 bytes long.
Data: < -[ > 08 2D 5B 01 CD CD CD CD
{95633} normal block at 0x0205FC88, 8 bytes long.
Data: < w > 88 95 77 04 CD CD CD CD
Object dump complete.
Medical.exe 中的 0x7c92100b 處最可能的異常: 0xC0000005: 讀取位置 0x01ae1f40 時發(fā)生訪問沖突
Medical.exe 中的 0x7c92100b 處未處理的異常: 0xC0000005: 讀取位置 0x01ae1f40 時發(fā)生訪問沖突
從上面可以看到是CImgProcessDlg::SaveCurrentToUndo()函數(shù)造成的內(nèi)存泄露,該函數(shù)的定義是:
void CImgProcessDlg::SaveCurrentToUndo()
{
KFreeImage * pUndo = new KFreeImage ;
*pUndo = m_kOrgImage ;
m_undo.push_back(pUndo) ;
}
發(fā)現(xiàn)KFreeImage * pUndo = new KFreeImage ;這句分配了內(nèi)存但沒有釋放掉,每次調(diào)用都泄露一次。修改該函數(shù)如下
void CImgProcessDlg::SaveCurrentToUndo()
{
KFreeImage * pUndo = new KFreeImage ;
*pUndo = m_kOrgImage ;
m_undo.push_back(pUndo) ;
pUndo->Unload();
pUndo = NULL;
}
輸出窗口提示就沒有內(nèi)存泄露了
No memory leaks detected.
Visual Leak Detector is now exiting.
Medical.exe 中的 0x7c92100b 處最可能的異常: 0xC0000005: 讀取位置 0x01ae1f40 時發(fā)生訪問沖突
Medical.exe 中的 0x7c92100b 處未處理的異常: 0xC0000005: 讀取位置 0x01ae1f40 時發(fā)生訪問沖突
|
|