TXMLDocument在释放时出现“无效的指针操作”错误

5

我正在使用TXMLDocument来编写一个用于Web服务器的XML字符串。该组件在服务器接收请求时创建,生成XML并将其传递回客户端,然后释放该组件。然而,当该组件被释放时,会出现无效的指针操作

  XML:= TXMLDocument.Create(nil);
  try
    XML.Active:= True;
    nRoot:= XML.AddChild('topics');
    for X := 0 to FCHM.Topics.Count - 1 do begin
      nTopic:= nRoot.AddChild('topic');
      //Add more data...

    end;
    Response.ContentText:= XML.XML.Text;
    Response.ContentType:= 'text/xml';
    XML.Active:= False;
  finally
    XML.Free; //<-- Invalid pointer operation
  end;

我为什么会收到这个错误信息,如何去除它?
奇怪的是,尽管我可以确认Response.ContentText确实得到了XML数据,但由于某种原因,在此异常之后,Web服务器无法将此数据返回给客户端 - 但我假设这是一个不同的原因/效果问题。
附注 - 因为Web服务器是多线程和TXMLDocument是COM,所以在此处理程序周围调用CoInitialize(nil)CoUninitialize
1个回答

9

构造函数的说明中指出:

运行时创建且没有所有者的TXMLDocument组件,在其IXMLDocument接口的所有引用被释放后,将自动释放。

由于您在TXMLDocument构造函数调用中未指定Owner,因此不应自行释放它。


1
哇,我从来没有想到会是这样的情况。感谢你指出来。 - Jerry Dodge
或者,您可以使用 Delphi 专门用于此目的的函数:iDoc := NewXMLDocument; 其中 iDocIXMLDocument 类型的变量。 - pf1957
不客气。无论如何,您可以将XML变量声明为IXMLDocument,并调用NewXMLDocument函数来创建一个新文档。 - TLama
2
仅仅移除free是不够的。你必须引用由对象实现的接口。这意味着改变你分配构造函数结果的变量类型。通常为IXMLDocument。 - David Heffernan
我知道这已经是10年前的事了,但是通过谷歌搜索我来到了这里,如果其他人也遇到同样的问题,这里似乎存在一个Delphi XML类中的bug,如果你在构造函数中传递nil。在加载xml文件后调用TXMLDocument的任何方法(例如xmlDoc.DocumentElement;)都会导致从XML类深处引发InvalidPointer错误。我通过将Application.MainForm传递到构造函数中来解决了这个问题。 - Steve Childs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接