简短版本: 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();
}
答案 0 :(得分:2)
您的代码段看起来正在创建一些内存泄漏。我担心这也是代码似乎暂时“起作用”的原因。
通常,Xerces解析器拥有文档树。请查看AbstractDOMParser::adoptDocument()以将所有权从解析器转移出去。这意味着对于您的代码示例,如果您正确地释放解析器,文档也会被删除,使得指向DOMElement的指针无效。
解决方案是调用adoptDocument()并在之后将指针保存到Document Element。请注意,您需要释放节点树(在关闭应用程序时?),并且树可能会占用大量内存,具体取决于XML的大小...
希望这有帮助