0

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

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

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

我相信这个问题与 Delphi 5 和 Delphi 6 如何实现接口有关。我只是将接口及其实现从 Delphi 6 复制到 5。Delphi 没有正确释放内存。调试代码我们确定问题的根源在于TXMLDocument.ReleaseDocXMLDoc.pas。似乎这条线FDOMDocument := nil没有释放它应该做的内存。

有人可以给我一些帮助吗?如果我们不能解决这个问题,我们将不得不使用另一个 XML 库重新编码整个事情。

4

4 回答 4

4

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

您需要调试以找出您的 Delphi 5 程序出错的地方。

从一个证明内存没有被释放的小测试用例开始。在两个版本的 Delphi 中运行它以确认该问题仅在 Delphi 5 中出现。

如果可能,在 Delphi 6 测试用例中也使用您的 Delphi 5 版本的 XML 库。否则,您无法确定在将库翻译到 Delphi 5 时没有自己引入问题。

于 2012-04-17T21:41:49.817 回答
3

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

还要验证您是否没有其他引用FDOMDocument会阻止 ReleaseDoc 释放它。

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

于 2012-04-18T02:14:23.703 回答
1

您可以检查 fDOMDocument 是否在其他地方有其他引用:就在设置 fDOMDocument := NIL 之前,请执行

references := fDOMDocument._AddRef ;
fDOMDocument._Release ;

如果“references”大于 1,你需要去搜索其他持有接口引用的变量。

于 2012-04-18T17:00:30.770 回答
1

非常感谢各位...

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

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

function TXMLNode._Release: Integer;

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

感谢你的宝贵时间!

于 2012-05-24T18:50:40.680 回答