替换Document的根节点

时间:2011-09-14 09:19:33

标签: c++ xml libxml2

由于我更换了根节点的XML文档,我在使用libxml++的应用程序中发现了内存泄漏。我非常注意删除任何子节点,但是使用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
}

我到目前为止提出的解决方案是编辑文档的根节点以更改其名称和属性。有没有更简单的方法来避免这种泄漏,而这种泄漏不涉及以前根节点的名称和属性的编辑?

1 个答案:

答案 0 :(得分:1)

我通过在调用Doc = xmlpp:Document()之前将文档设置为空的Document对象(create_root_node_by_import)而不是显式删除root的子节点来解决此问题。这似乎会导致Doc的先前内容被释放。

我几年前第一次遇到这个问题,在最近的libxml ++版本中似乎没有修复。他们当然必须意识到这一点。这种情况可能会以某种方式以一种非预期的方式使用create_root_node_by_import吗?我不会这么想,但是OTOH看起来太重要了,不能解决。