【问题标题】:Debug heap memory leak detection - strange results?调试堆内存泄漏检测 - 奇怪的结果?
【发布时间】:2011-03-13 09:15:51
【问题描述】:

我认为我的 C++ 应用程序很紧凑,不会泄漏任何内存。长时间运行的压力测试和静态代码分析器似乎也表明了这一点。但是,在执行非常复杂的使用场景时,Visual Studio 2008 内置调试​​堆会在退出时显示如下警告:

检测到内存泄漏!
倾倒对象 ->
{318231} 0x03397FF8 处的普通块,0 字节长。
数据:üû

什么是 0 字节长度的内存“泄漏”?我是否以某种方式破坏了堆?什么可能导致调试堆发出这样的警告?

【问题讨论】:

    标签: c++ visual-studio visual-studio-2008 memory-leaks


    【解决方案1】:

    啊。没关系,我找到了。静态链接库通过 new[] 分配长度为 0 的数组。我想如果它也使用 delete [] 来杀死它,这将是可以的。但是,删除调用是有条件的,只有在数组大小 > 0 时才会发生。

    【讨论】:

      【解决方案2】:

      在括号中的空值之后看到那些“u”字符令人毛骨悚然。但是查看 CRT 源代码,这可以通过转储代码中的错误来解释,当内存块为 0 字节(dbgheap.c 中的 valbuff 变量)时,它似乎不会以零结尾字符串。

      否则,分配零字节是受支持的方案。而且您的代码没有取消分配它也许也不是很神秘。如果您可以在“正常块”输出稳定之前获得数字,那么您可以在初始化代码中分配 _crtBreakAlloc() 以强制断点。或者,您可以在 CRT 调试分配器上设置条件断点。跟踪到 malloc 或 new 调用以找到它。

      【讨论】:

      • 感谢您的回答。我会奖励你指出分配 0 字节实际上是一个有效的场景 - 这种洞察力引导我走上正确的道路。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-20
      • 1970-01-01
      • 2011-08-24
      • 1970-01-01
      • 2012-07-06
      • 2015-05-09
      相关资源
      最近更新 更多