我在申请时遇到了一些问题。它过去工作得很好但今天当我再次运行它来测试它时我得到了一些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
奇怪的是,它曾经用于查找,现在我从不知道这个错误(我在源代码中没有改变任何一个月,它曾经工作正常)。
如果有人知道为什么会出现这个错误,我将不胜感激。 提前谢谢。
答案 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);
...
}
当xml
和root
变量超出范围时,它们将自动减少您的引用计数。如果你想"免费"他们手动,你可以简单地为他们分配NULL:
root = NULL;
xml = NULL;
或者调用他们的Release()
方法:
root.Release();
xml.Release();