刚参加工作,最近需要使用xml;前人用的是libxml,所以我也学习了一点点xml知识。暂时记录下来。大家如果看到有不对的地方,希望指正。
1. 是否需要显示释放:
libxml调用xmlNewNode时,采用的是动态生成方式。这些生成的节点,通常情况下是在xmlFreeDoc时被级联删除掉;但是如果某个节点并没有加入到Doc(里的rootNode)中,那么删除Doc时,该节点并不会被删除;因此需要调用xmlFreeNode显式删除;该问题之前并没有获得足够的重视,因此造成了部分的内存泄漏。
2.xmlFreeNode的使用:
xmlFreeNode的删除是级联删除,即如果你删除一个节点,会级联删除掉该节点的所有子节点;
3.自己的小总结是:
a.最好将代码改写成try catch结构,函数动态生成的节点在该函数的catch中要动态释放;
b.如果某个函数生成了一个父节点和若干个子节点,最好将子节点在生成完之后就添加在父节点中,在对其进行操作,以防止该节点变成游离节点,无法释放。
下例是我认为比较好的一种编写风格:
xmlNodePtr creatPos(string cityCode)
{
xmlNodePtr pos = xmlNewNode(NULL,BAD_CAST"POS");
try
{
xmlNodePtr source = xmlNewNode(NULL,BAD_CAST"SOURCE");
xmlAddChild(pos,source);
//如果xmlAddchild放在了throw之后,释放会比较麻烦。
if(cityCode.empty())
throw exception("exception!");
xmlNewProp(source,BAD_CAST"CityCode",BAD_CAST cityCode.c_str());
return pos;
}
catch(...)
{
xmlFreeNode(pos);
throw;
}
}