【问题标题】:TXMLDocument 'Invalid pointer operation' when freeing释放时 TXMLDocument '无效的指针操作'
【发布时间】:2013-08-03 16:19:15
【问题描述】:

我正在使用TXMLDocument 编写一个用于Web 服务器的XML 字符串。当服务器接收到请求,生成 XML,将其传递回客户端时,组件被创建,然后组件被释放。然而,当这个组件被释放时,我得到Invalid pointer operation

  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 服务器在此异常之后未能将此数据返回给客户端 - 但我假设这是不同的原因/结果问题。

PS - 围绕此处理程序调用 CoInitialize(nil)CoUninitialize,因为 Web 服务器是多线程的,TXMLDocument 是 COM。

【问题讨论】:

    标签: xml delphi exception delphi-xe2


    【解决方案1】:

    constructor's 参考文献中有说明:

    在运行时创建的没有所有者的 TXMLDocument 组件 当对其 IXMLDocument 的所有引用时自动释放 接口已发布。

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

    【讨论】:

    • 哇,我从没想过会是这样。感谢您指出这一点。
    • 或者,你应该使用 Delphi 的函数:iDoc := NewXMLDocument; 其中iDocIXMLDocument 类型的变量。
    • 不客气。无论如何,作为替代方案,您可以将XML 变量声明为IXMLDocument 并创建一个新的文档调用NewXMLDocument 函数。
    • 仅删除免费是不够的。您必须引用对象实现的接口。这意味着更改您分配构造函数结果的变量的类型。通常为 IXMLDocument。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多