Заменить корневой узел для документа

Я обнаружил утечку памяти в своем приложении с помощью libxml ++ из-за XML-документа, в котором я заменяю корень узел. Я хорошо позаботился об удалении всех дочерних узлов, но, используя интерфейс xmlpp::Document, я не нахожу возможности заменить корневой узел.

Это образец кода нарушения:

xmlpp::Document Doc;
Doc.create_root_node("root");
// Populate the document
// [...]

void ReplaceRootNode(const xmlpp::Element* NewRootNode)
{
  // Remove all root node children
  xmlpp::Element* RootNode = Doc.get_root_node();
  const xmlpp::Node::NodeList Children = RootNode->get_children();
  xmlpp::Node::NodeList::const_iterator itChild = Children.begin();
  while (itChild != Children.end()) {
    RootNode->remove_child(*itChild++);
  }

  // Replace root node
  Doc.create_root_node_by_import(NewRootNode); // Leak: memory for previous root node is not freed
}

Решение, которое я придумал до сих пор, - отредактировать корневой узел документа, изменив его имя и атрибуты, но. Есть ли более простой способ избежать этой утечки, не связанный с редактированием имени и атрибутов предыдущего корневого узла?


person Antonio Pérez    schedule 14.09.2011    source источник


Ответы (1)


Я работаю над этим, устанавливая документ на пустой объект Document (Doc = xmlpp:Document()) перед вызовом create_root_node_by_import вместо явного удаления корневых дочерних узлов. Похоже, это приводит к освобождению предыдущего содержимого Doc.

Я впервые столкнулся с этой проблемой несколько лет назад, и она до сих пор не решена в последних версиях libxml ++. Конечно, они должны это знать. Может ли этот случай каким-то образом использовать create_root_node_by_import непреднамеренно? Я бы так не подумал, но OTOH это кажется слишком важным, чтобы не исправлять.

person BGJ    schedule 09.06.2012
comment
Я подозревал то же самое, что использование create_root_node_by_import не было предназначено для этого, поэтому вопрос. - person Antonio Pérez; 11.06.2012