我正在使用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
?我是否需要遍历文档树并自行释放所有内存?
答案 0 :(得分:11)
documentation for LinkEndChild
说:
注意:要添加的节点由指针传递,然后由tinyXml拥有(并删除)。这种方法很有效并且避免了额外的复制,但是应该小心使用,因为它使用的内存模型与其他插入函数不同。
答案 1 :(得分:-1)
您使用new
分配的任何内容永远不会自动清理 - 您(或至少某人)需要致电delete header;
等
我说“有人”,因为TiXmlDocument
对象可能拥有这些对象的所有权并自行清理它们 - 知道这一点的唯一方法就是查看TinyXML的文档。
如果它不占用所有权,那么最好只在堆栈中声明本地对象:
TiXmlDeclaration decl( "1.0", "", "" ); // etc.
如果您需要在函数末尾保留对象,则使用共享指针会更安全,例如Boost's shared_ptr