【问题标题】:Memory Leaks not detected by CRT Memory Leak DetectionCRT 内存泄漏检测未检测到内存泄漏
【发布时间】:2012-07-16 12:28:24
【问题描述】:

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

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

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

【问题讨论】:

  • 让我们看看创建对象的代码以及你如何处理对象或指向对象的指针
  • Obejct 非常大,所以我无法发布整个代码 - 它由 new 分配并使用 delete 释放 - 你想确切地看到什么 - 每个 new 都有一个 delete 和每个 new[ ] 有一个 delete[] ...
  • 如果你只这样做,为什么不在堆栈上创建对象 - 所以不需要 new 和 delete
  • @Mark - 可能是因为 OP 标记了“多线程” 在线程之间通信对象的地方,在堆栈上创建对象可能非常狡猾 - RAII 的诅咒可能会在之前把它吹走它由其他线程处理。
  • 在尝试使用任务管理器检测泄漏时要非常小心。 “经过几次跑步,这会耗尽我的全部记忆。” - 发生了什么,你得到一个例外?尝试最小化您的应用并再次恢复它 - 看看会发生什么。

标签: c++ multithreading memory-leaks


【解决方案1】:

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

你可以试试Visual Leak Detector,它是谷歌免费提供的。

This question 包含其他内存检查产品的列表,从基本到相当高级/昂贵。 CRTDBG 是最小公分母解决方案;虽然 BoundsChecker 不是免费的,但我很幸运。

【讨论】:

  • 但是与 CRT 检漏仪有什么区别 - 那么它有什么优势呢? CRT 是否无法检测到所有内容,或者我为什么要使用 Virtual Leak Detector?
  • @DenisD:来自 Google 页面:The main difference ... is that Visual Leak Detector shows you the complete callstack used for memory allocation has led to the leak.
【解决方案2】:

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

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

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

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

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

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

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

...

【讨论】:

  • 当我在线程中运行的“主”对象被破坏并且线程退出后,我使用了 _CrtDumpMemoryLeaks。它没有显示这个对象留下的任何东西。
猜你喜欢
  • 1970-01-01
  • 2012-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多