gpt4 book ai didi

delphi - 无法释放 IXMLDocument、IXMLNodeList 或其他(omnixml 的)接口(interface)类型对象

转载 作者:行者123 更新时间:2023-12-01 19:51:13 28 4
gpt4 key购买 nike

下面的函数接受 XML 输入,对其进行解析,然后返回一个普通字符串,该字符串仅显示在调用方函数中。因此上下文中的对象是下面函数的内部对象。

但是这个函数有一个奇怪的问题,它会记住输入,这意味着对象没有正确释放。即使输入被检查为不同,输出字符串也有一部分是由先前调用产生的。

在将 XMLDoc、IXMLNodeList 中的每一个分配给 nil 之前,我还尝试在循环中释放通过将 nil 分配给 Item 数组直接引用的每个 IXMLNode,但是该分配语句导致了语法错误,因此解决了以下问题。

function tform1.nodeToSentence(nodeXml: string): string ;
var
tempXmlDoc : IXMLDocument;
resultWordPuncNodes : IXMLNodeList;
i: Integer;

begin
tempXmlDoc := CreateXMLDoc;
tempXmlDoc.LoadXML(nodeXml);
resultWordPuncNodes := XPathSelect(tempXmlDoc.DocumentElement,'//*');

for i:= 0 to resultWordPuncNodes.Length-1 do
begin

if resultWordPuncNodes.Item[i].NodeName = 'name' then
begin
if resultWordPuncNodes.Item[i].Attributes['attrib'] = 'v_attrib' then
begin
Result := TrimRight(Result);
Result := Result + resultWordPuncNodes.Item[i].Text + ' ';
end
else Result := Result + resultWordPuncNodes.Item[i].Text + ' ';
end;
end;


resultWordPuncNodes:=nil;
tempXmlDoc := nil; //interface based objects are freed this way
end;

调用代码

//iterating over i   
nodeXML := mugList.Strings[i];
readableSentence := nodeToSentence(mugList.Strings[i]);
//examplesList.Append(readableSentence);
//for debugging
showMessage(readableSentence);
//iteration ends

最佳答案

But this function has a strange problem that, it remembers the input which means that the objects are not released properly. Output string has a part resulting from the previous call even if the input is checked to be different.

这是因为String返回函数的值(以及其他ARC管理类型,以及记录对象和方法指针)使用隐藏的var参数在调用者和被调用者之间传递,该参数在输入函数时不会自动清除,就像您一样期待。

这段代码:

function tform1.nodeToSentence(nodeXml: string): string ;
...
readableSentence := nodeToSentence(mugList.Strings[i]);

实际上与此代码相同:

procedure tform1.nodeToSentence(nodeXml: string; var Result: string);
...
nodeToSentence(mugList.Strings[i], readableSentence);

多次调用nodeToSentence(),您可能会将越来越多的文本附加到同一个String变量。

在函数内部,您需要手动重置 Result 值,然后再开始将新值连接到其中:

function tform1.nodeToSentence(nodeXml: string): string ;
var
...
begin
Result := ''; // <-- add this!
...
end;

关于delphi - 无法释放 IXMLDocument、IXMLNodeList 或其他(omnixml 的)接口(interface)类型对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41026057/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com