Posted on 2011-06-17 13:03
昨日不在,今日不怠 閱讀(5768)
評(píng)論(7) 編輯 收藏 引用
TinyXMLDocument的撤銷問題
自己寫了一個(gè)xml讀取寫入的程序,但在最初沒怎么在意,在調(diào)試過程中程序總是崩潰,后來發(fā)現(xiàn)有個(gè)指針調(diào)用為空(C++中的陷阱就在于此)。另一方面,卻發(fā)現(xiàn)使用TinyXML過程中使用了好多new來創(chuàng)建節(jié)點(diǎn)。C++不像java和C#,要事必躬親,自己管理內(nèi)存。new創(chuàng)建的對(duì)象都保存在堆上,必須手動(dòng)delete掉??晌乙矝]做處理,開始迷惑了。
找了半天,最后還是發(fā)現(xiàn)的端倪:
對(duì)于一個(gè)TinyXMLDocument對(duì)象,在析構(gòu)時(shí),會(huì)將其子節(jié)點(diǎn)都釋放掉,它的子節(jié)點(diǎn)都是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對(duì)象釋放時(shí),會(huì)對(duì)所有已經(jīng)連接進(jìn)來的節(jié)點(diǎn)進(jìn)行釋放,所以不需要手動(dòng)的去釋放所new出來的東西。
但是,還需要注意,如果TiXmlDocument對(duì)象也是new出來的,則需要對(duì)TiXmlDocument對(duì)象執(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