无效的指针操作TXMLDocument

时间:2014-09-13 22:24:54

标签: c++builder-xe2

我在申请时遇到了一些问题。它过去工作得很好但今天当我再次运行它来测试它时我得到了一些Invalid Pointer Operation例外。

这是代码的一部分: 我在这里声明:

TXMLDocument *xml;

下面几行我构建它:

xml = new TXMLDocument(NULL);

然后在构造下面几行我正在加载xml,然后尝试访问名为" root"的根节点:

xml->LoadFromXML(AnsiString(final_xml.c_str()));

//at the line below i am getting the Invalid Pointer Operation exception.
_di_IXMLNodeList root = xml->ChildNodes->GetNode("root")->GetChildNodes();

在函数结束时,我将删除xml:

delete xml;

在这里你可以找到整个功能: http://pastebin.com/MpRf8Gfn

奇怪的是,它曾经用于查找,现在我从不知道这个错误(我在源代码中没有改变任何一个月,它曾经工作正常)。

如果有人知道为什么会出现这个错误,我将不胜感激。 提前谢谢。

1 个答案:

答案 0 :(得分:1)

如果您阅读了文档,则使用TXMLDocument所有者创建NULL实例会使其像引用计数接口对象而不是普通对象。因此,您需要遵循适当的引用计数语义,这是您没有做的,因此崩溃。

在这种情况下,最好的方法是使用LoadXMLData()_di_IXMLDocument,例如:

void __fastcall TForm1::dataUpload2ServerServe(TCustomIpClient *ClientSocket)
{
    _di_IXMLDocument xml;
    ...
    xml = LoadXMLData(final_xml.c_str());
    _di_IXMLNodeList root = xml->DocumentElement->ChildNodes;
    ...
    xml->SaveToFile(filename);
    ...
}

xmlroot变量超出范围时,它们将自动减少您的引用计数。如果你想"免费"他们手动,你可以简单地为他们分配NULL:

root = NULL;
xml = NULL;

或者调用他们的Release()方法:

root.Release();
xml.Release();