【问题标题】:Memory leaks in Debug mode调试模式下的内存泄漏
【发布时间】:2010-01-28 22:17:37
【问题描述】:

在调试模式下编译而不是在发布模式下,程序是否有任何泄漏的原因?

(Debug表示调试信息,禁用编译器优化,Release表示无调试信息/完全优化)

这似乎是这样做的,但我不知道为什么。顺便说一句,净化在这里没有帮助

【问题讨论】:

  • 你怎么知道它不会在发布时泄露?
  • 我让它运行了几个小时它根本没有增长(在任务管理器中),而同一时间范围内的调试版本增长(就像原始大小的 3 倍)跨度>
  • 我使用 vld (sites.google.com/site/dmoulding/vld) 发现泄漏的效果很好,它实际上只在调试模式下工作
  • 我不是在寻求一种方法来找到泄漏......因为发布时没有泄漏。这对客户来说很重要:) 无论如何感谢您的回答

标签: c++ visual-c++ compiler-construction memory-leaks


【解决方案1】:

许多指针类型错误,包括内存泄漏,在调试和释放模式之间切换时似乎会出现或消失。几个原因可能是:

  • 在一个或另一个版本中编译的条件代码
  • 事物的记忆位置会四处移动
  • 调试版中未初始化数据的特殊格式

【讨论】:

  • +1 用于提及未初始化的数据。刚刚修复了一些不久前由此引起的错误。
【解决方案2】:

您如何检测泄漏?如果是通过任务管理器,MSVC 调试实现将在设置_CRTDBG_DELAY_FREE_MEM_DF 标志时保留释放的内存。

也有可能是 Release 中不存在内存泄漏。

编辑:您也可以手动调用HeapCompact(GetProcessHeap(), 0)。我似乎记得调试堆总是在增长(即它不返回空闲块),但我在任何地方都找不到该文档。

【讨论】:

【解决方案3】:

这里还有一个,assert() 调用有副作用,这可能会导致更大的问题

assert (new Object());

如果 assert 在发布模式下得到优化,可能会导致这种行为

【讨论】:

    【解决方案4】:

    调试和发布模式使用不同的内存模型。

    在某些情况下,程序在一种模式下运行而在另一种模式下崩溃。

    可能导致这种情况的原因是内存损坏(尤其是堆栈损坏)。这可能是存在差异的原因。另一个原因可能是调试器没有释放所有东西,但我对此表示怀疑。

    顺便说一句,您使用的是 VS 2010 测试版吗?这也可能是测试版中的一个错误。

    【讨论】:

      【解决方案5】:

      您要尝试隔离的第一件事是泄漏是否是由于 #define _DEBUG 或更微妙且可能更难以确定的原因 - 即某些不应该进行优化的东西。

      使用#define _DEBUG 编译发布,看看它是否仍然发生。

      【讨论】:

        【解决方案6】:

        有条件的#ifdef _DEBUG 行可能是原因之一。

        【讨论】:

          【解决方案7】:

          试试Debugging Tools for Windows附带的User Mode Dump Heap,也看看Application Verifier可能会说什么。所有这些工具都非常强大,强烈推荐。

          否则,除非您有泄漏代码,即 #ifdef-ed,否则我认为 Debug 构建没有泄漏的原因,而 Release 很好。

          【讨论】:

            【解决方案8】:

            这可能是很多事情,但请记住,这可能是误报。在调试模式下,您可以指望使用至少两倍的内存。这可以使您的程序大小扩大很多倍,并且通常一旦它上升,即使内存全部在内部释放,它也不会再次下降。如果“泄漏”没有随着时间的推移变得更糟但最终停止,那并不是真正的泄漏。

            【讨论】:

              猜你喜欢
              • 2010-12-01
              • 2021-01-10
              • 2010-11-23
              • 2018-11-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-09-28
              相关资源
              最近更新 更多