Posted on 2011-06-17 13:03
昨日不在,今日不怠 閱讀(5767)
評論(7) 編輯 收藏 引用
TinyXMLDocument的撤銷問題
自己寫了一個xml讀取寫入的程序,但在最初沒怎么在意,在調(diào)試過程中程序總是崩潰,后來發(fā)現(xiàn)有個指針調(diào)用為空(C++中的陷阱就在于此)。另一方面,卻發(fā)現(xiàn)使用TinyXML過程中使用了好多new來創(chuàng)建節(jié)點。C++不像java和C#,要事必躬親,自己管理內(nèi)存。new創(chuàng)建的對象都保存在堆上,必須手動delete掉??晌乙矝]做處理,開始迷惑了。
找了半天,最后還是發(fā)現(xiàn)的端倪:
對于一個TinyXMLDocument對象,在析構(gòu)時,會將其子節(jié)點都釋放掉,它的子節(jié)點都是new出來的,也必須delete掉。但TinyXML的析構(gòu)函數(shù)是空的,什么也沒寫,不要忘了,TinyXMLDocument是從TinyXMLNode繼承而來,在TinyXMLNode的析構(gòu)函數(shù)中,卻清楚的寫著:
TiXmlNode::~TiXmlNode()
{
TiXmlNode* node = firstChild;
TiXmlNode* temp = 0;
while ( node )
{
temp = node;
node = node->next;
delete temp;
}
}
即,doc對象釋放時,會對所有已經(jīng)連接進(jìn)來的節(jié)點進(jìn)行釋放,所以不需要手動的去釋放所new出來的東西。
但是,還需要注意,如果TiXmlDocument對象也是new出來的,則需要對TiXmlDocument對象執(zhí)行delete,才可以觸發(fā)析構(gòu)函數(shù)被調(diào)用。
參考
http://blog.csdn.net/zhoubl668/archive/2008/12/29/3635320.aspx
http://www.shnenglu.com/zhaoyg/archive/2010/03/29/110862.html
http://hi.baidu.com/hpagent/blog/item/7c3cf8fe17c54790b801a066.html