在DOMElement *之前,XercesDOMParser *和DOMDocument *超出范围

时间:2013-07-01 14:54:47

标签: xerces-c

简短版本: XercesDOMParser*DOMDocument*在用于创建的DOMElement*之前超出范围是否安全?

长版:

在下面的代码段中,我创建了一个本地XercesDOMParser*DOMDocument*,以便获取文档的根元素并将其存储在成员DOMElement*变量中。 XercesDOMParser*DOMDocument*都在构造函数末尾超出范围,但DOMElement*作为成员变量存在。这个可以吗?到目前为止它似乎有效,但我很紧张,以后我可能会遇到问题。

JNIRequest::JNIRequest(JNIEnv *env, jobject obj, jstring input)
{
    char *szInputXML = (char*) env->GetStringUTFChars(input, NULL);
    XMLPlatformUtils::Initialize();
    XercesDOMParser* pParser = new XercesDOMParser();
    XMLByte* xmlByteInput = (XMLByte*) szInputXML;
    xercesc::MemBufInputSource source(xmlByteInput, strlen(szInputXML), "BufferID");
    pParser->parse(source);
    DOMDocument* pDocument = pParser->getDocument();
    /* This next variable is a DOMElement* */
    this->_pRootElement = pDocument->getDocumentElement();  
}

1 个答案:

答案 0 :(得分:2)

您的代码段看起来正在创建一些内存泄漏。我担心这也是代码似乎暂时“起作用”的原因。

通常,Xerces解析器拥有文档树。请查看AbstractDOMParser::adoptDocument()以将所有权从解析器转移出去。这意味着对于您的代码示例,如果您正确地释放解析器,文档也会被删除,使得指向DOMElement的指针无效。

解决方案是调用adoptDocument()并在之后将指针保存到Document Element。请注意,您需要释放节点树(在关闭应用程序时?),并且树可能会占用大量内存,具体取决于XML的大小...

希望这有帮助