我认为我的C ++应用程序非常紧凑,不泄漏任何内存。长时间运行的压力测试和静态代码分析器似乎表明了这一点。但是,在执行非常复杂的使用szenario时,内置在调试堆中的Visual Studio 2008将在退出时显示一些警告,如下所示:
检测到内存泄漏!
倾倒物体 - >
{318231}正常阻塞位于0x03397FF8,长度为0个字节
数据:<> üû
什么是0字节长度的内存“泄漏”?我是否以某种方式破坏了堆?什么可能导致调试堆发出类似的警告?
答案 0 :(得分:2)
在空括号后看到那些“u”字符令人毛骨悚然。但是看一下CRT源代码,这可以通过转储代码中的一个错误来解释,当内存块为0字节时(dbgheap.c中的valbuff变量),它似乎不会终止字符串。
否则,支持零字节是受支持的方案。并且你的代码没有解除分配也许也不是很神秘。如果您可以在“正常块”输出稳定之前获得该数字,那么您可以在初始化代码中指定_crtBreakAlloc()来强制断点。或者您可以在CRT调试分配器上设置条件断点。跟踪malloc或新调用以找到它。
答案 1 :(得分:1)
哎呀。没关系,我发现了它。静态链接库通过new []分配长度为0的数组。如果它也使用delete []来杀死它,那就没关系。但是,删除调用是有条件的,只有在数组大小> 0