当前位置:C++技术网 > 资讯 > VS自动检测到msxml3.dll内存泄漏,新增功能导致内存泄漏问题发作

VS自动检测到msxml3.dll内存泄漏,新增功能导致内存泄漏问题发作

更新时间:2016-11-03 16:56:35浏览次数:1+次

    在程序调试运行结束后,看到VS的输出栏中显示下面这样的消息:
线程 'Win32 线程' (0x2510) 已退出,返回值为 1 (0x1)。
“Monitor.exe”: 已卸载“C:\Windows\SysWOW64\msxml3.dll”
Detected memory leaks!
Dumping objects ->
{4682} normal block at 0x0373B008, 11648 bytes long.
 Data: < 1              > CC 31 84 01 0A 00 00 00 CD CD CD CD CD CD CD CD 
Object dump complete.

    很明显,这是VS检测到了内存泄漏!指明了泄漏位置为msxml3.dll。泄漏的内存大小为11648字节。因为也没有出现故障,赶着项目也就没有理会。只能等着有时间了去查一下。
    今天在增加项目的功能,结果老是崩溃。崩溃的位置就是xml文件。我以为是我新加入的代码带入的问题,结果查来查去,没有问题。然后只能从xml代码里找了。因为一开始我以为,一直运行着,软件没有问题,应该不至于是已有代码的问题吧。然而新代码真的找不到问题了,只能尝试着在旧代码里看看。或许是新代码的加入,让旧代码的Bug触发了。
    按着这个想法,开始分析加载配置文件xml文件的代码,结果发现一个地方,在一个循环操作节点的时候,节点列表节点没有释放。然后将对应的该释放的地方释放,也就是调用Release函数。并且要按照顺序来释放。在节点最上层的,或者叫做子节点,应该先释放,父节点后释放。按照这个顺序处理完之后,没有崩溃了。欣喜!!
    然后突然意思到,之前的xml文件里的内存泄漏顺便看看。然后看了下输出,没有内存泄漏提示了。隐约之中,感觉到内存泄漏就是这里了。当然,调试运行了几次,都没有出现内存泄漏提示了。但是这个不能完全应证这个想法,恐有不妥。所以,就将代码恢复为原先的状态,看看内存泄漏提示会不会再出来。通过代码的修改,如果让症状有变化,说明问题点就是对的。如果恢复了代码,出现了内存泄漏提示,然后再改成正确的代码,内存泄漏提示消失,就可以完全说明问题点就是这个位置了。
    果不其然,恢复原先的代码后,内存泄漏又出现了。为了进一步的确认内存泄漏事实,我继续从内存泄漏的提示的信息来分析。
    内存泄漏的字节数大概有11648字节。我看了一下我加载的xml文件的大小,12461字节,这是xml字符的大小,最后被格式化到内存,大小会有稍微的波动,基本是提示的字节数和文件内容的数据大小一致。
    综合来看,内存泄漏和这次新增功能表现出来的崩溃,其实是一个问题。只是内存泄漏开始没有被触发,新增功能触发了。这叫做,“踏破铁鞋无觅处得来全不费工夫”。感觉还是挺不错的。
    我用的是VS2010,竟然也会自动检测内存泄漏。不过并不是所有的内存泄漏都能检测得到。如果你发现VS提示了内存泄漏,那么还是要注意下,去解决它。等它发作的时候,可能就是别的功能开发的时候,或者特定条件引发,那时候,可能问题表现的很奇怪,让人摸不着头脑。所以,发现问题,及早解决问题,防患于未然。