0

我在使用应用程序时遇到了一些问题。它曾经工作得很好,但是今天当我再次运行它以对其进行更多测试时,我遇到了一些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

奇怪的是,它曾经可以正常工作,现在我不知从哪里得到了这个错误(我在源代码中没有更改任何内容大约一个月,它曾经工作正常)。

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

4

1 回答 1

1

如果您阅读文档,创建TXMLDocument具有所有者的实例NULL会导致它像引用计数接口对象而不是普通对象一样工作。因此,您需要遵循正确的引用计数语义,而您没有这样做,因此会崩溃。

在这种情况下,最好的方法是使用LoadXMLData()and _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();
于 2014-09-18T00:03:42.403 回答