Debug, Release, 初始化

這兩天碰到了一個bug,表現是這樣的:Debug下一切正常,一派祥和之氣;Release下暗潮洶湧,很不正常;Release模式編出來的東西,用lua的Decoda調試也乖得很,不出任何問題。這是怎麼回事呢?

掃一遍代碼,沒看出端倪,再掃N遍,還是沒有收穫;最終還是通過調試找到了問題出在哪裏,並解決掉。回頭看看,也算是費了很大的勁才搞定。

首先說下問題出在哪裏:類中的一個數據成員沒有被初始化;其次,說下解決方法:在構造函數的初始化列表中正常初始化。一切就這麼簡單。

發現問題,解決問題是一方面,而完全搞懂問題,掌握問題則是另一方面。不完全弄清楚前因後果,誰能保證下次你不會犯同樣的錯誤呢?簡單解釋下原因:

你通過new創建了一個對象,然後銷燬,再然後用new創建了一個完全一樣的對象。假如這個對象的類中有一個數據成員,既沒有被初始化,也沒有在析構函數中進行類似清0,復位之類的操作,並且如果你之後new出的對象是建立在原來的內存空間上,那麼此刻該成員的值就是你最初創建的對象銷燬之前對應的值。更進一步,該值如果在你的程序中佔據着很重要的位置,那難免不會出錯。

總結看來,release進行了優化,第二次new出的對象,是建立在原對象的內存空間上;而debug和調試模式下,第二次使用的內存空間和第一次的 位置上沒必然聯繫(這個地方說的不夠嚴謹,因爲我現在也不清楚這方面的具體細節。望高手指點,有空詳細補充上)

說起來總是很抽象,可以看這樣一個例子: 

class Control 
{
 void destroyWorld(){..} 
void happy() {..} 
public: int year; Control(){} }

Control *ptr1 = new Control; .. ptr1->year = 2012; .. delete ptr1;

Control *ptr2 = new Control; .. if((ptr2->year) == 2012) ptr2->destroyWorld(); else ptr->happy(); 



舉例而已,我們不會有這樣簡單的失誤;

另一方面,實際情況要“含蓄”很多很多;

代碼不是人,絕不模棱兩可,0是0,1是1;

程序員絕對必須要有清晰透徹明朗的感覺;

沒看懂上面所有的東西也沒關係,但請務必記住這樣一句話:養成良好的習慣,對象的所有數據成員,必須進行初始化!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章