为什么Delphi 6的MSXML库在Delphi 5中泄漏内存?

时间:2012-04-17 19:59:47

标签: xml delphi memory-management interface msxml

我们有一个使用Delphi 5开发的应用程序,由于某些不重要的原因,我们无法升级到Delphi 6或更高版本。

前一段时间我们不得不在该应用程序中实现XML处理,我决定使用Delphi 6复制我们为其他应用程序所做的实现。

一切都很顺利。我将Delphi 6源代码(msxml.pas,xmldoc.pas,msxmldom.pas等)翻译成Delphi 5.必须对每个文件进行微调(例如删除Variants使用)。它有效,但我在释放内存方面遇到了一些问题。

我认为问题与Delphi 5和Delphi 6如何实现接口有关。我只是将接口及其实现从Delphi 6复制到5. Delphi没有正确释放内存。调试代码我们确定问题的根源在XMLDoc.pas上的TXMLDocument.ReleaseDoc上。似乎行FDOMDocument := nil没有释放它应该执行的内存。

有人可以给我一些帮助吗?如果我们无法修复此问题,我们将不得不使用另一个XML库重新编写整个内容。

4 个答案:

答案 0 :(得分:4)

Delphi 6以与Delphi 5相同的方式发布接口对象。

您需要进行调试才能找到Delphi 5程序出错的地方。

从一个小的测试用例开始,该测试用例表明内存不会被释放。在两个版本的Delphi中运行它以确认问题仅在Delphi 5中展示。

如果可能的话,也可以在Delphi 6测试用例中使用Delphi 5版本的XML库。否则,当您将库翻译成Delphi 5时,您无法确定自己是否没有自己介绍该问题。

答案 1 :(得分:3)

在这两种情况下仔细检查FDOMDocument实际上是一个接口,否则'FDOMDocument:= nil'只会在对象引用时泄漏。

另请确认您没有另外提及FDOMDocument,这会阻止ReleaseDoc释放它。

特别要注意接口上的循环引用!

答案 2 :(得分:1)

您可以检查fDOMDocument是否在其他位置保留了其他引用:在设置fDOMDocument之前:= NIL,执行

references := fDOMDocument._AddRef ;
fDOMDocument._Release ;

如果“references”大于1,则需要搜索其他保存对接口的引用的变量。

答案 3 :(得分:1)

非常感谢...

我不知道为什么会这样做,但在将Delphi 6文件复制到Delphi 5时,我更改了行

Result := inherited _Release;Result := 0; //inherited _Release;

on function TXMLNode._Release: Integer;

改回来了。经过测试,Delphi 5程序就像Delphi 6一样开始运行......

再次感谢您的时间!