我们有一个使用Delphi 5开发的应用程序,由于某些在这里不重要的原因,我们不能升级到Delphi 6或更高版本。
不久前,我们必须在应用程序中实现XML处理,我决定复制我们使用Delphi6为其他应用程序实现的实现。
一切都很顺利。我翻译了Delphi6源代码(msxml.pas、xmldoc.pas、msxmldom.pas等)。对于Delphi 5,必须对每个文件进行细微的调整(例如,删除使用的变体)。它起作用了,但我在内存释放方面遇到了一些问题。
我认为这个问题与Delphi 5和Delphi 6如何实现接口有关。我只是把接口和它们的实现从Delphi6复制到了Delphi5。Delphi没有正确释放内存。通过对代码进行调试,我们确定问题的根源在于XMLDoc.pas上的TXMLDocument.ReleaseDoc。看起来FDOMDocument := nil这一行并没有释放它应该释放的内存。
有人能在这方面给我一些帮助吗?如果我们不能解决这个问题,我们将不得不使用另一个XML库重新编码整个代码。
发布于 2012-05-25 02:50:41
非常感谢你们..。
我不知道为什么要这样做,但在将Delphi6文件复制到Delphi5时,我更改了这一行
Result := inherited _Release;到Result := 0; //inherited _Release;
在function TXMLNode._Release: Integer;上
改回来了。经过测试,Delphi5程序开始像Delphi6一样运行。
再次感谢您的宝贵时间!
发布于 2012-04-18 05:41:50
Delphi 6以与Delphi 5相同的方式释放接口对象。
你需要调试来找出你的Delphi5程序出错的地方。
从一个小的测试用例开始,它演示了内存不会被释放。在两个版本的Delphi中运行它,以确认该问题仅在Delphi 5中出现。
如果可能,也可以在Delphi6测试用例中使用您的Delphi5版本的XML库。否则,当您将该库转换到Delphi 5时,您不能确定不是自己引入了这个问题。
发布于 2012-04-18 10:14:24
仔细检查FDOMDocument在这两种情况下实际上都是一个接口,否则如果'FDOMDocument := nil‘是一个对象引用,它只会泄漏。
还要确认您没有持有另一个会阻止ReleaseDoc释放它的对FDOMDocument的引用。
尤其要注意接口上的循环引用!
https://stackoverflow.com/questions/10198244
复制相似问题