Memory leaks 处理Windows上不正确的内存泄漏报告

Memory leaks 处理Windows上不正确的内存泄漏报告,memory-leaks,Memory Leaks,我正在编写一些Windows软件,当它终止时,我收到许多错误的内存泄漏消息: Detected memory leaks! Dumping objects -> {29745} normal block at 0x02938E38, 36 bytes long. Data: <, E > 2C 0B 45 10 00 00 00 00 01 00 00 00 01 CD CD CD {29732} normal block at 0x02938C08

我正在编写一些Windows软件,当它终止时,我收到许多错误的内存泄漏消息:

Detected memory leaks!
Dumping objects ->
{29745} normal block at 0x02938E38, 36 bytes long.
 Data: <, E             > 2C 0B 45 10 00 00 00 00 01 00 00 00 01 CD CD CD 
{29732} normal block at 0x02938C08, 500 bytes long.
 Data: <X)A         `  @> 58 29 41 10 00 00 00 00 01 00 00 00 60 93 0B 40 
{29721} normal block at 0x028DA8A0, 84 bytes long.
 Data: < 1D         0 %i> C8 31 44 10 00 00 00 00 01 00 00 00 30 85 25 69 
检测到内存泄漏!
转储对象->
0x02938E38处的{29745}正常块,36字节长。
数据:2C 0B 45 10 00 00 00 01 CD
0x02938C08处的{29732}正常块,500字节长。
资料:58 29 41 10 00 00 01 00 00 60 93 0B 40
0x028DA8A0处的{29721}正常块,84字节长。
数据:<1D 0%i>C8 31 44 10 00 00 01 00 00 00 30 85 25 69
我肯定这些都是误报。你对处理这个问题有什么建议吗?随着软件的发展,可能会有一些实际的漏洞,至少可以说,找到它们将是困难的

编辑
我应该提到我正在使用一个名为
OpenSceneGraph
的库。它在内部大量使用引用计数的智能指针。所有这些泄漏都是I
new
然后传递到库中的实例,库会立即将其包装在
ref\u ptr
中。我知道这些实例没有泄漏,因为我已经向析构函数添加了
fprintf
,并且在智能指针超出范围时确实看到了消息。微软不久前在标准库中遇到了类似的问题,我想知道我是否在这里看到了类似的东西?显然,该错误与一些
\u CRT\u块
被标记为
\u正常块
有关

编辑2


我知道发生了什么事。转储内存泄漏信息的代码发生在所有静态数据超出范围之前。在一种情况下,内部对象是通过原型模式构建的,原型对象是静态的,因此在atexit机制启动之前不会被破坏。所以,没有真正的泄漏。只是转储发生在应用程序崩溃之前。

我发现这些都不太可能是误报。A他们在.

中说,当我以前遇到这个问题时(似乎被删除的内容显示为泄漏),通常是因为我忘记或没有说明指针分配取代了我新分配的指针分配

然后它“似乎”删除得很好,而原来的新对象却泄漏了。

哪个编译器

还可以使用另一个分析/泄漏检测工具。(邦德谢克等)

我过去得到的误报从未阻止我发现“真正的”泄漏

我不同意其他人说你对误报的看法是错误的,但要仔细检查——检查你所有的“新”并跟踪应用程序逻辑,让自己相信这些都是错误的

您还可以在对象中添加保护、标记或内存签名,以确保它们不是您创建的对象


不知道第三方的东西该告诉你什么。我会联系第三方软件公司,询问他们是否意识到任何问题-误报或其他问题。

我还想说,很可能你有真正的韭菜(它们也可能存在于你正在使用的某些第三方代码中)

但有一种方法可以准确地找到哪些分配没有被释放。 请看这里:

(当然,对于其他版本的VS,您必须在以下位置更改dll名称:

{,,msvcr71d.dll}_crtBreakAlloc

对于正确的版本(msvcr90d.dll=VS 2008、msvcr80d.dll=VS 2005、msvcr71d.dll=VS 2003、msvcr70d.dll=VS 2002)

VS为在.dll(不使用MFC)中分配为静态的内存提供泄漏内存报告,因为该报告(出于某种原因)是在删除.dll之前生成的(并且在卸载DLL时将正确取消分配)。因此是误报。

你怎么能确定它们是误报?我敢打赌它们不是误报。相反,我会花时间和资源来理解为什么会有内存泄漏。你能发布你的源代码吗?我知道它们是误报,因为我添加了代码来在构造函数和dest中记录消息构造函数。我的日志包含两条消息。这通常是误报的情况。很高兴你找到了它。@cbrulak:我知道有点晚了,但那不是很有用。我采用了这种方法,它导致我陷入了一个过度调试的虫洞,找到了一个一开始就不存在的问题。我有BoundsChecker,它在处理智能方面遇到了很多问题h引用计数智能指针。我已通过电子邮件向他们的支持人员寻求帮助。我正在使用Visual Studio 2005。我刚刚在上面添加了一个编辑来解释我发现的内容(生成转储后超出范围的静态数据).很高兴听到你找到了它。这是典型的结果,有一些误报-在分析器“完成”后删除很抱歉匆忙下结论,我很高兴你发现了问题所在。这些都是误报。如果我们要胡说些陈词滥调,那么这一条怎么样:了解你的工具的局限性。我不知道内存转储发生得有多早。用“你的假设是错误的”回答任何问题都很容易,但这并没有太大帮助。