1

C++ の DOM* クラスの createXXX メソッドに関する質問です。DOM* createXXX メソッドから返されたメモリーを解放するために何か特別なことをする必要がありますか?

例(トランスコードは単純化のために削除され、トランスコード操作に関連する変数の関連リリース、私はそれらについて知っています):

pImplement = DOMImplementationRegistry::getDOMImplementation("LS");
DOMDocument* pDoc = pImplement->createDocument("Examples", "example", NULL );
DOMElement* pRoot = pDoc->getDocumentElement();

DOMElement* firstElement = pDoc->createElementNS(("Examples", "example");
DOMElement* secondElement = pDoc->createElementNS("Examples", "example2");

DOMAttr* name = pDoc->createAttribute("Name");

XMLCh* somenameValue = XMLString::transcode("Fred");
name->setValue(somenameValue);

secondElement->setAttributeNode(name);
firstElement->appendChild(secondElement);

最終的にメソッドを離れるとき、createXXX メソッドからメモリを解放するために、firstElement、secondElement、name に対して何か特別なことをする必要がありますか? それとも、pdoc がすべてのメモリを所有していて、DOMDocument を破棄するのを待たなければならないのでしょうか?

議論に追加する場合は、名前/値のロジックをループして、複数の属性を secondElement に追加します。

ありがとう。

4

2 に答える 2

2

DOM クラスを使用した私の経験によると、DOM ツリーに追加したものを削除する必要はありません。たとえばsecondElement、要素に子を追加しますfirstElement。後者が解放されると、それも解放されsecondElementます。ただし、ここで漏れる 2 つのことがわかります。まず、firstElementDOM ツリーに挿入しません。次に、終了時に明示的に削除pDocしません。要素を解放するか、DOM ツリーに追加して、コードの後半で削除する必要があります。

于 2011-04-14T18:39:51.120 に答える
1

注: 関連する関数の名前から、Xerces-C について話していると仮定します。

ツリーのルートでreleaseを呼び出すだけで済みます (
DOMElement (ツリーの「ブランチ」のみを削除する場合) または DOMDocument (ツリー全体を削除する場合))。ドキュメントとそのドキュメントに接続pDoc->release();されているすべてのノードのメモリを解放します。

于 2011-04-14T19:23:49.513 に答える