• 【转】简单内存泄漏检测方法 解决 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

      

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

  • 相关阅读:
    hdu2328 Corporate Identity
    hdu1238 Substrings
    hdu4300 Clairewd’s message
    hdu3336 Count the string
    hdu2597 Simpsons’ Hidden Talents
    poj3080 Blue Jeans
    poj2752 Seek the Name, Seek the Fame
    poj2406 Power Strings
    hust1010 The Minimum Length
    hdu1358 Period
  • 原文地址:https://www.cnblogs.com/budapeng/p/3316657.html
Copyright © 2020-2023  润新知