5

私はTinyXmlで次のことをしています:

TiXmlDocument doc;
TiXmlDeclaration* decl = new TiXmlDeclaration( "1.0", "", "" );
TiXmlElement* main = new TiXmlElement("main");

TiXmlElement* header = new TiXmlElement("header");
header->SetAttribute("attribute","somevalue");
main->LinkEndChild(header);

// ... Add many more TiXmlElment* to other elements all within "main" element

doc.LinkEndChild(decl);
doc.LinkEndChild(main);

// ... do stuff with doc

// Now I am done with my doc. What memory management happens here? 

プログラムの実行の最後に、が範囲外になると、すべてTiXmlElement*がクリーンアップされますか? doc自分でドキュメント ツリーをたどってすべてのメモリを解放する必要がありますか?

4

2 に答える 2

13

ドキュメントにLinkEndChildは次のように記載されています。

注: 追加されるノードはポインターによって渡され、以降は tinyXml によって所有 (および削除) されます。この方法は効率的で余分なコピーを回避しますが、他の挿入関数とは異なるメモリ モデルを使用するため、注意して使用する必要があります。

于 2009-05-12T16:38:10.760 に答える
-1

あなたが割り当てたものは自動的にクリーンアップされるnewことはありません.あなた(または少なくとも誰か)は電話をかける必要がありますdelete header;.

TiXmlDocumentオブジェクトがこれらのオブジェクトの所有権を取得し、それ自体をクリーンアップする可能性があるため、「誰か」と言います。それを知る唯一の方法は、TinyXML のドキュメントを確認することです。

所有権を取得しない場合は、スタックでローカル オブジェクトを宣言するだけのほうがよいでしょう。

TiXmlDeclaration decl( "1.0", "", "" );    // etc.

オブジェクトを関数の最後まで保持する必要がある場合は、Boost などのshared_ptr共有ポインタを使用する方が安全です。

于 2009-05-12T16:25:46.613 に答える