1

XMLを生成するxercesのインターネットで見つけた例を見てきました。トランスコード機能は何らかのエンコードを実行しているように見えますが、移入先のバッファーは決して解放されません。ドキュメントによると、ti を手動でリリースする必要があります。

注: 返されたバッファーは動的に割り当てられ、不要になったときに削除するのは呼び出し元の責任です。XMLString::release を呼び出して、この返されたバッファを解放できます。

doc->release はこれをメモリから解放できますか?

    XMLCh tempStr[100];

    XMLString::transcode("Range", tempStr, 99);
    DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(tempStr, 0);

    XMLString::transcode("root", tempStr, 99);
    DOMDocument*   doc = impl->createDocument(0, tempStr, 0);
    DOMElement*   root = doc->getDocumentElement();

    XMLString::transcode("FirstElement", tempStr, 99);
    DOMElement*   e1 = doc->createElement(tempStr);
    root->appendChild(e1);

    XMLString::transcode("SecondElement", tempStr, 99);
    DOMElement*   e2 = doc->createElement(tempStr);
    root->appendChild(e2);
    doc->release();
4

2 に答える 2

2

誤解していた場合はご容赦ください。ただし、transcode使用している のバージョンは、指定したもの ( ) を変更しているため、実際にはバッファーを作成したり返したりしませんtempStr。あなたのサンプルコードはメモリをリークしません。

transcodeバッファを返すバージョン(たとえば、サンプル コード ブロックのバージョンを除く他のすべてのバージョン) は、インスタンスを使用MemoryManagerて割り当てを実行します。ドキュメントはここでは少しまばらに見えますが、私が知る限り、デフォルトXMLPlatformUtils::fgMemoryManagerでは、割り当てられたメモリをクリーンアップするという主張はありません。したがって、返されたバッファを自分で破棄する必要があると想定する必要があります。

于 2012-07-31T15:44:22.647 に答える
1

No, doc->release() is not releasing the buffer.

As the documentation you quoted says, you would need to release the buffer with XMLString::release(), if you were calling a transcode function that returns a transcoded string:

char *str = XMLString::transcode(someStringVarToBeTranscoded);
XMLString::release(&str);

Your example does not need to do this, because you are using a transcode function that returns a boolean value.

于 2012-07-31T15:48:45.293 に答える