• 【转】简单内存泄漏检测方法 解决 Detected memory leaks! 问题


    我的环境是: XP SP2 . VS2003

    最近在一个项目中,程序退出后都出现内存泄漏:

    Detected memory leaks!
    Dumping objects ->
    {98500} normal block at 0x05785AD0, 152 bytes long.
     Data: << N       N x 7 > 3C AC 4E 10 00 00 00 00 BC A4 4E 10 78 B6 37 00 
    Object dump complete.
     

    而且每次退出都是一样的.泄漏的内存块都是98500.

    解决方法:

    1. 在程序开始启动的地方(足够前的地方,只要在泄漏的内存分配的前面)使用代码:

    _CrtSetBreakAlloc(98500); //98500为上面内存泄漏的块号.

    2. 然后debug运行,程序自动断点在"内存块98500"分配的位置:

    /* break into debugger at specific memory allocation */
    if (_crtBreakAlloc != -1L && lRequest == _crtBreakAlloc)
        _CrtDbgBreak();
     

    3 .我们已经找到了泄漏的那块内存分配的底层操作的地方了(好拗口!).

    这个时候我们利用 "调试" –> "退出" ,快捷键为:"Shift + F11" .

    跳出当前函数..然后一直往"上"跳,边跳边查看调用栈.直到看到了自己写的代码,例如我的

    std::ifstream* origStream = new std::ifstream();
     

    4 .这个时候我已经可以判断 origStream 分配了内存,但是没有合理释放.处理后再次运行就没有出现内存泄漏了.

    5.最后,记得把_CrtSetBreakAlloc(98500); 这句话删除掉,不然每次都断点,岂不是烦死..

    ----------------------------------------------------------------------------------------------------------

    写在后面:

    关于内存泄漏检测,有一个Visual Leak Detector ,按照它的介绍的确很不错,可以直接具体到代码行指出内存泄漏,但是个人使用了一下,发现debug的速度太慢了,不知道是不是我个人程序的问题.......像上面的泄漏,我用CrtSetBreakAlloc这种简单的方法就足够了....

    By: 洪庚伟

    转自http://www.cnblogs.com/G_Weber/archive/2009/04/15/1436362.html

      

      如果每次提示的内存块号不一样,可以多试几次找到出现概率比较大的那个,多试几次。一般情况下存在内存泄露的内存块号分布是比较集中的。

  • 相关阅读:
    潭州课堂25班:Ph201805201 django 项目 第二课 git 版本控制 (课堂笔记)
    HTML中的转义字符
    Java防止SQL注入
    Web很脆弱,SQL注入要了解
    防止sql注入:替换危险字符
    Hadoop HA详解
    java代码---charAt()和toCharry()的用法
    java代码-----计算器,界面+功能+boolean
    java代码-----运用endWith()和start()方法
    java代码---indexOf()方法
  • 原文地址:https://www.cnblogs.com/budapeng/p/3316657.html
Copyright © 2020-2023  润新知