我们有一个使用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库重新编写整个内容。
答案 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一样开始运行......
再次感谢您的时间!