|
下载地址:http://vld.codeplex.com/
安装这个工具后添加上它的的include和lib目录即可,然后比如在stdafx.h中
#inclide<vld.h>
即可。。。。
在Debug运行后,在“输出”窗口就会出现下面这样的提示,定义出了泄露内存的地方。。。
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 时发生访问冲突
Medical.exe 中的 0x7c92100b 处未处理的异常: 0xC0000005: 读取位置 0x01ae1f40 时发生访问冲突
从上面可以看到是CImgProcessDlg::SaveCurrentToUndo()函数造成的内存泄露,该函数的定义是:
void CImgProcessDlg::SaveCurrentToUndo()
{
KFreeImage * pUndo = new KFreeImage ;
*pUndo = m_kOrgImage ;
m_undo.push_back(pUndo) ;
}
发现KFreeImage * pUndo = new KFreeImage ;这句分配了内存但没有释放掉,每次调用都泄露一次。修改该函数如下
void CImgProcessDlg::SaveCurrentToUndo()
{
KFreeImage * pUndo = new KFreeImage ;
*pUndo = m_kOrgImage ;
m_undo.push_back(pUndo) ;
pUndo->Unload();
pUndo = NULL;
}
输出窗口提示就没有内存泄露了
No memory leaks detected.
Visual Leak Detector is now exiting.
Medical.exe 中的 0x7c92100b 处最可能的异常: 0xC0000005: 读取位置 0x01ae1f40 时发生访问冲突
Medical.exe 中的 0x7c92100b 处未处理的异常: 0xC0000005: 读取位置 0x01ae1f40 时发生访问冲突
|
|