0

简短版本:XercesDOMParser* a和在他们用来创建 DOMDocument*的 a 之前超出范围 是否安全?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();  
}
4

1 回答 1

2

您的代码片段看起来像是造成了一些内存泄漏。恐怕这也是代码目前似乎“工作”的原因。

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

解决方案是调用采用文档(),然后保存指向文档元素的指针。请注意,您需要释放节点树(在关闭应用程序时?)并且树可能会消耗大量内存,具体取决于 XML 的大小......

希望这可以帮助

于 2013-07-03T08:51:29.440 回答