【问题标题】:XercesDOMParser* and DOMDocument* going out of scope before a DOMElement*XercesDOMParser* 和 DOMDocument* 在 DOMElement* 之前超出范围
【发布时间】:2013-07-01 14:54:47
【问题描述】:

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

加长版:

在下面的代码 sn-p 中,我创建了一个本地 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();  
}

【问题讨论】:

    标签: xerces-c


    【解决方案1】:

    您的代码 sn-p 看起来会造成一些内存泄漏。恐怕这也是代码目前似乎“工作”的原因。

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

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

    希望对你有帮助

    【讨论】:

    • 在对象的析构函数中释放XercesDOMParser*DOMDocument* 成员变量是否可以让我不必使用adoptDocument() 并在应用程序关闭时释放节点树?
    • 是的,只要您不在 XercesDOMParser 对象上再次调用 parse(),文档就会保留在解析器中。如果您不调用adoptDocument(),解析器也会释放文档...
    猜你喜欢
    • 1970-01-01
    • 2012-09-26
    • 2021-11-23
    • 2023-03-27
    • 1970-01-01
    • 2012-05-04
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多