2

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

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

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

4

2 回答 2

1

不确定您是如何使用 CRTDBG 库的,但它提供了很多好东西:

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

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

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

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

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

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

...

于 2012-07-17T15:35:14.233 回答
1

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

您可以试用Google 免费提供的Visual Leak Detector 。

此问题包含其他内存检查产品的列表,从基本到相当高级/昂贵。CRTDBG 是最小公分母解决方案;我在 BoundsChecker 上运气不错,虽然它不是免费的。

于 2012-07-17T14:47:26.680 回答