风一样的划过

继续那未完成的征途。。。
posts - 3, comments - 7, trackbacks - 0, articles - 0

TinyXML总结

Posted on 2011-06-17 13:03 昨日不在,今日不怠 阅读(5745) 评论(7)  编辑 收藏 引用

    
TinyXMLDocument的撤销问题
       自己写了一个xml读取写入的程序,但在最初没怎么在意,在调试过程中程序总是崩溃,后来发现有个指针调用为空(C++中的陷阱就在于此)。另一方面,却发现使用TinyXML过程中使用了好多new来创建节点。C++不像java和C#,要事必躬亲,自己管理内存。new创建的对象都保存在堆上,必须手动delete掉。可我也没做处理,开始迷惑了。
     找了半天,最后还是发现的端倪:
      对于一个TinyXMLDocument对象,在析构时,会将其子节点都释放掉,它的子节点都是new出来的,也必须delete掉。但TinyXML的析构函数是空的,什么也没写,不要忘了,TinyXMLDocument是从TinyXMLNode继承而来,在TinyXMLNode的析构函数中,却清楚的写着:

   

TiXmlNode::~TiXmlNode()
{
    TiXmlNode* node = firstChild;
    TiXmlNode* temp = 0;

    while ( node )
    {
        temp = node;
        node = node->next;
        delete temp;
    } 
}


即,doc对象释放时,会对所有已经连接进来的节点进行释放,所以不需要手动的去释放所new出来的东西。
但是,还需要注意,如果TiXmlDocument对象也是new出来的,则需要对TiXmlDocument对象执行delete,才可以触发析构函数被调用。

参考
      http://blog.csdn.net/zhoubl668/archive/2008/12/29/3635320.aspx
      http://www.cppblog.com/zhaoyg/archive/2010/03/29/110862.html  
     http://hi.baidu.com/hpagent/blog/item/7c3cf8fe17c54790b801a066.html 



Feedback

# re: TinyXML总结  回复  更多评论   

2011-06-17 21:02 by xiao_liang
CMarkup挺好用

# re: TinyXML总结  回复  更多评论   

2011-06-18 12:20 by right
以前也用tiny,现在都用RapidXML了

# re: TinyXML总结  回复  更多评论   

2011-06-18 13:59 by cdy20
这种方式和qt内存管理方式一样。
父节点释放 同事回检查子节点 一起释放

# re: TinyXML总结  回复  更多评论   

2011-06-18 23:16 by 昨日不在,今日不怠
@right
评价比tinyxml高啊,可以试试。谢谢交流!

# re: TinyXML总结  回复  更多评论   

2011-06-18 23:19 by 昨日不在,今日不怠
@cdy20

嗯,当然,这样是件好事,不过,还是要知道它做了什么,这样用着才踏实放下。。。

# re: TinyXML总结  回复  更多评论   

2011-06-20 12:14 by 杨粼波
RapidXML
TinyXML
这两个都是比较轻量级的。其中RapidXML,boost里面有用到。boost/property_tree里面用到了。因为,RapidXML内部自建了一个内存池,所以相对来说要比TinyXML要快。实验证明确实是如此的。而且,二者之间使用方法上比较相近。

# re: TinyXML总结  回复  更多评论   

2013-07-12 16:57 by 曦花
终于解答了我的疑问
O(∩_∩)O谢谢你!!!

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理