我正在努力将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
取消链接。