Posted on 2011-06-17 13:03
昨日不在,今日不怠 阅读(5744)
评论(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