当内存分配数量不总是相同时,如何检测内存泄漏?

时间:2017-08-14 02:32:55

标签: c++ memory memory-leaks dynamic-memory-allocation

我的程序中出现了内存泄漏(55字节),就像这样。 我正在使用C ++,MFC,Visual Studio 2010。

检测到内存泄漏! {13497}正常阻塞位于0x0E44C248,长度为55个字节。 资料:44 3A 5C 46 44 41 53 ....

问题是,内存分配号“13497”并不总是相同。如果我再次运行程序,它总是不同的数字。 我想在退出之前用_crtBreakAlloc找到我没有释放内存的地方,但似乎无法打破内存分配号。 我也使用了_CrtSetDbgFlag和_CrtDumpMemoryLeaks,但它也运行不正常。

在这种情况下有没有办法检测内存泄漏?

谢谢。

3 个答案:

答案 0 :(得分:2)

您可以使用像cppcheck这样的静态分析器,或者如Joe所说,重新映射运算符new

我开发了一些你可以使用的内存泄漏工具:

https://github.com/check69/Utils/blob/master/leaks.cpp

https://github.com/check69/Utils/blob/master/leaks.h

有一些visual studio指令可以在控制台输出中获取泄漏,以便更轻松地进行调试。

PS:我会把它作为评论发表在joe post中,但我需要50分来发表评论。

答案 1 :(得分:1)

有几种方法可以攻击它。

  1. 查看您可能识别的任何类型字符串的数据转储。这可能有助于您找到它。
  2. 在内存分配上放置一个条件断点,只有在请求(或分配)的大小为55字节时才会中断。
  3. 您可以通过在所有代码包含的标题中尽早放置类似的内容(如stdafx.h)来获得更好的结果
  4. 此代码重新映射operator new

    #ifdef _DEBUG
    #    define _CRTDBG_MAP_ALLOC
    #    include <crtdbg.h>
    #    include <new>
    #    include <memory>
    #    define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
    #    define new DEBUG_NEW
    #endif
    
    1. 此外,您运行/使用应用程序的次数越多,泄露的内存量是否会增加?如果没有,它可能根本就不是泄漏。有时您可能会因静态分配的对象而报告泄漏。至少,请仔细查看您制作的静态分配

答案 2 :(得分:0)

您好,感谢您的回答..

通过使用&#34; Visual Leak detector&#34;我很容易找到泄漏位置。来自https://vld.codeplex.com/ 我强烈建议那些有同样问题的人。 :)你可以下载它并把它放在你的项目中。