c-libxml2-为什么xmlFreeNode()会导致分段错误



我正在努力将libxml2引起的内存泄漏降至最低。

我毫无问题地释放了xmlDoc。但当我尝试释放xmlNode时,它会导致分割错误。在这种情况下,它以某种方式阻止程序找到文件,然后xmlReadFile返回NULL指针,因此xmlDocGetRootElement也返回NULL指针,尝试访问root_element会导致segmentation fault

如果我只是用xmlFreeNode()注释了这些行,那么一切都很好。

只是为了再次检查,在尝试释放节点之前,我尝试检查节点指针是否不是NULL,但这没有帮助。

为什么我不能毫无问题地释放节点?

int setKey(uint8 newState)
{
xmlDocPtr doc = NULL;
xmlNodePtr root_element = NULL;
xmlNodePtr cur_node = NULL;
char newChar[3];
const char *file = "file.xml";
doc = xmlReadFile(file, NULL, 0);
sprintf(newChar, "%d", newState);
root_element = xmlDocGetRootElement(doc);
cur_node = root_element->children; // segmentation fault
xmlNodeSetContent(cur_node, (const xmlChar *)newChar);
xmlSaveFile(file, doc);
xmlFreeDoc(doc);
if(cur_node != NULL && root_element != NULL)
{
xmlFreeNode(cur_node);
xmlFreeNode(root_element);
}
return 1;
}

xmlFreeDoc递归释放文档和所有子节点。因此,再次释放单个节点会导致双重释放,这通常会导致segfault。如果您想在释放文档后保留一些节点,则必须先将它们与xmlUnlinkNode取消链接。

相关内容

  • 没有找到相关文章

最新更新