代码之家  ›  专栏  ›  技术社区  ›  f4.

调试模式下的内存泄漏

  •  1
  • f4.  · 技术社区  · 14 年前

    在调试模式下编译而不是在版本中编译时,程序是否有泄漏的原因?

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

    这似乎就是它的作用,但我不明白为什么。btw净化在这里没有帮助

    8 回复  |  直到 14 年前
        1
  •  4
  •   Trent    14 年前

    很多指针类型错误,包括内存泄漏,都可以 似乎 在调试和发布模式之间切换时出现或消失。可能有以下几个原因:

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

    你是怎么发现泄漏的?如果通过任务管理器,则MSVC调试实现将在 _CRTDBG_DELAY_FREE_MEM_DF 设置标志。

    还有可能您的内存泄漏在发行版中不存在。

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

        3
  •  3
  •   Trent    14 年前

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

    assert (new Object());
    

    如果assert在释放模式下得到优化,可能会导致此行为

        4
  •  1
  •   George    14 年前

    调试和释放模式使用不同的内存模型。

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

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

    顺便问一下,你在使用vs 2010测试版吗?这也可能是测试版的一个错误。

        5
  •  1
  •   Igor Zevaka    14 年前

    你要做的第一件事就是确定泄漏是否是由于 #define _DEBUG 或者是一些更微妙、更难确定的东西——例如,一些不应该优化的东西。

    编译发布 定义调试 看看是否还会发生。

        6
  •  0
  •   Remus Rusanu    14 年前

    有条件的 #ifdef _DEBUG 线条可能是一个原因。

        7
  •  0
  •   Dmitry    14 年前

    试一试 User Mode Dump Heap 随附的 Debugging Tools for Windows ,还可以看看 Application Verifier 可能不得不说。所有这些工具都非常强大,强烈推荐。

    否则,除非您有泄漏代码,即 #ifdef -Ed,我看不到调试构建泄漏的任何原因,而发行版也可以。

        8
  •  0
  •   Charles Eli Cheese    14 年前

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