Какое управление памятью мне нужно очистить при использовании TinyXml для C ++? - PullRequest
4 голосов
/ 12 мая 2009

Я делаю следующее с 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 выйдет из области видимости? Нужно ли мне ходить по дереву документов и самостоятельно освобождать всю память?

Ответы [ 2 ]

11 голосов
/ 12 мая 2009

Документация для LinkEndChild гласит:

ПРИМЕЧАНИЕ: добавляемый узел передается по указателю и впредь будет принадлежать (и удаляться) tinyXml. Этот метод эффективен и позволяет избежать лишней копии, но его следует использовать с осторожностью, поскольку он использует модель памяти, отличную от других функций вставки.

0 голосов
/ 12 мая 2009

Все, что вы выделите с помощью new, не будет никогда автоматически очищаться - вам (или, по крайней мере, кому-то) нужно позвонить delete header; и т. Д.

Я говорю «кто-то», потому что вполне возможно, что TiXmlDocument объект получает владение этими объектами и очищает их сам - единственный способ узнать это - проверить документацию TinyXML.

Если он не вступает во владение, лучше просто объявить локальные объекты в стеке:

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

Если вам нужно, чтобы объекты сохранялись после окончания функции, безопаснее использовать общие указатели, например, Boost's shared_ptr.

...