找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2913|回复: 0
打印 上一主题 下一主题
收起左侧

检测内存泄露工具 Visual Leak Detector for Visual C++ 2008/2010

[复制链接]
跳转到指定楼层
楼主
ID:77367 发表于 2015-4-18 21:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下载地址: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 时发生访问冲突




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表