内存泄漏未被CRT内存泄漏检测检测到

我得到了这个问题,我的应用程序有一个无限的内存泄漏,这是不被发现的。 我做的很简单,就是创建一个对象,在其上运行一个方法,然后删除该对象。 每次我这样做时,TaskManager中的内存使用量都会增长大约50-100MB。 这在一些运行后耗尽了我的整个记忆。 我通过多线程来做到这一点,但是没有静态变量,所以我的线程中的不同对象之间没有冲突。 它们只使用其他对象的静态方法,不会修改任何其他内存,而不会修改参数中的内存 - 所以它是线程安全的。 我试图找出原因:

  • 使用crtdbg.h(CRT-Memeory-Leak-Detection),但是自从我的应用程序开始以来只存在泄漏 - 它们将在关机时被删除,并且它们并不那么大。
  • 我正在寻找所有我继承的对象中的虚拟析构函数,但它们都可以
  • 我还有什么可以尝试找出我的应用程序泄漏的位置? 我在HEAP中找不到任何泄漏,除了可能导致STACK泄漏的析构函数问题之外,我不知道任何其他原因(通过这个,我的意思是一个对象不会销毁一个本地的std :: string对象已经在堆中分配空间)。 我不知道“STACK-Leaks”是否还有其他原因,但我知道在我的方法中,内存增长最多的部分,没有HEAP分配。


    您可能想要使用更好,更强大的检漏仪。 您可能还需要使用能够在程序运行时的不同时间输出堆报告的泄漏检测器。 最后,你应该考虑你的问题可能是由堆碎片造成的,而不仅仅是泄漏。

    您可以尝试免费使用Google的Visual Leak Detector。

    这个问题包含了其他内存检查产品的列表,从基础到相当先进/昂贵。 CRTDBG是最常见的分母解决方案; 我已经与BoundsChecker好运,尽管它不是免费的。


    不知道你如何使用CRTDBG库,但它提供了很多好东西:

    http://msdn.microsoft.com/en-us/library/x98tx3cf.aspx

    您可以使用_CrtMemCheckpoint以分而治之的方式。 它允许您测量代码中两点之间的内存使用差异。 使用多线程可能很困难。

    另一个是_CrtDumpMemoryLeaks(我认为在应用程序结束时会执行),并启用_CRTDBG_MAP_ALLOC,这应显示内存分配的确切位置。

    另一个提示是,也许你有你的CRTDBG过度配置,有很多小的分配它可以创建巨大的内部内存结构。

    尝试关闭部分代码,并检查问题是否仍然存在。

    如果您每天构建应用程序,请尝试运行以前的版本以发现问题出现的位置,然后比较源代码库中的更改。

    ...

    链接地址: http://www.djcxy.com/p/19927.html

    上一篇: Memory Leaks not detected by CRT Memory Leak Detection

    下一篇: GCC memory leak detection equivalent to Microsoft crtdbg.h?