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 回答