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

时间:2012-07-17 14:39:49

标签: c++ multithreading memory-leaks

我遇到了问题,我的应用程序存在无限增长的内存泄漏,但未检测到。我做的非常简单,就是创建一个对象,在其上运行一个方法,然后删除该对象。每次执行此操作时,TaskManager中的内存使用量增长约50-100MB。一些运行后,这耗尽了我的整个记忆。我通过多线程执行此操作,但没有静态变量,因此我的线程中的不同对象之间没有冲突。它们只使用其他对象的静态方法,这些方法不会修改除参数中传递的任何其他内存 - 因此它是线程安全的。 我试图找出原因:

  • 使用crtdbg.h(CRT-Memeory-Leak-Detection),但自我的应用程序启动以来只存在泄漏 - 它们将在关闭时被删除,并且它们不是那么大。
  • 我正在寻找我继承的所有对象中的虚拟析构函数,但它们都没问题

我还可以尝试找出应用程序泄漏的位置?我在HEAP中找不到任何泄漏,除了可能导致STACK泄漏的析构函数问题之外我不知道任何其他原因(我的意思是一个对象不会破坏本地std :: string对象已在堆中分配空间)。我不知道“STACK-Leaks”是否还有其他原因,但我知道在我的方法中,内存增长最多的部分,没有HEAP分配。

2 个答案:

答案 0 :(得分:1)

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

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

This question包含其他内存检查产品的列表,从基本到非常先进/昂贵。 CRTDBG是最低通用分母的解决方案;我对BoundsChecker好运,虽然它不是免费的。

答案 1 :(得分:1)

不确定您如何使用CRTDBG库,但它提供了许多好处:

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

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

另一个是启用了_CRTDBG_MAP_ALLOC的_CrtDumpMemoryLeaks(我认为无论如何在应用程序端执行),这应该显示内存分配的确切位置。

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

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

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

...