0

短いバージョン:XercesDOMParser*と が作成に使用された の前に範囲外にDOMDocument*出て も安全DOMElement*ですか?

長いバージョン:

以下のコード スニペットでは、ドキュメントのルート要素を取得してメンバー 変数に格納するために、ローカルのXercesDOMParser*andを作成します。とはどちらもコンストラクターの最後でスコープ外になりますが、 はメンバー変数として存続します。これでよろしいですか?今のところうまくいっているようですが、後で問題が発生するのではないかと不安です。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 へのポインターが無効になることを意味します。

解決策は、adoptDocument() を呼び出し、後でドキュメント要素へのポインターを保存することです。ノード ツリーを解放する必要があることに注意してください (アプリケーションを閉じるとき)。また、XML のサイズによってはツリーが大量のメモリを消費する可能性があることに注意してください ...

お役に立てれば

于 2013-07-03T08:51:29.440 に答える