2011-09-14 93 views
0

的根节点由于我在其中替换根节点的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 
} 

我想出了到目前为止的解决方法是编辑文档的根节点来改变它的名称和属性,但。有没有一种更简单的方法来避免这种泄漏,它不涉及以前根节点的名称和属性的版本?

回答

1

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

几年前我第一次遇到这个问题,而且它在最近版本的libxml ++中似乎还没有修复。当然,他们必须意识到这一点。难道这种情况会以某种方式以无意的方式使用create_root_node_by_import?我不会这么想,但OTOH这似乎太重要了,无法解决。

+0

我怀疑是一样的,'create_root_node_by_import'的用法不是以这种方式,因此这个问题。 –