由于使用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
}
到目前为止,我想出的解决方案是编辑文档的根节点以更改其名称和属性。是否有一种更简单的方法来避免这种泄漏,而该泄漏不涉及先前的根节点的名称和属性的版本?
最佳答案
我通过在调用Doc = xmlpp:Document()
之前将文档设置为空的Document对象(create_root_node_by_import
)来解决此问题,而不是显式删除根节点的子节点。这似乎导致Doc
的先前内容被释放。
几年前我第一次遇到此问题,但在最新版本的libxml ++中似乎仍未解决。当然,他们必须意识到这一点。这种情况会以某种意外的方式使用create_root_node_by_import
吗?我不会这么想,但是OTOH这似乎太重要了,无法解决。