刚参加工作,最近需要使用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;

  }

}

 

posted on 2012-11-23 16:52  飞天2012  阅读(958)  评论(0)    收藏  举报