【木頭 cocos2d-x】一個堆和棧引起的分手事件
——記憶體總是欺負我,于是我移情别戀愛上CCString了
我又來了,這次這篇文章依舊是獻給和我一樣被Java慣壞了,對C++還不太熟悉的朋友~
是以,熟悉C++的朋友,請忽略我~
笨木頭花心貢獻,啥?花心?不呢,是用心~
轉載請注明,原文位址: http://blog.csdn.net/musicvs/article/details/8267117
正文:
1. 一個堆和棧引起的分手事件
我有一個需求,那就是寫一個函數,用來将int轉換為字元串,于是,我很高興地寫了:
const char* StringUtil::transIntToStr( int iValue ) {
char chValue[8];
sprintf(chValue, "%d", iValue);
return chValue;
}
太簡單了,這有什麼難的~
(旁白:我噗~!不難的話你也不會在這裡說廢話了~)
額,好吧,實際上我遇到問題了,這個函數的chValue隻是一個臨時變量,函數結束,這個變量的記憶體空間就會被釋放。是以,我拿着這個函數的傳回值去做了不少事情,但是出現了很多莫名其妙的問題。因為這個值已經不存在了啊~!魂彈~!
(旁白:你才魂淡~!)
然後我去請教大神,大神一看到這個函數就情不自禁地喊出來了:“哇~!這代碼有問題,誰寫的?”
我:“我...”
(旁白:噗~!我就喜歡看到這樣的情景~~~啦啦啦~~)
char chValue[8];建立出來的變量,隻是儲存在棧裡面,函數一結束,就會被釋放,是以會出現很多意想不到的事情。
如果我們想在函數結束後,變量依舊有效(不會被釋放),那就要把變量放到堆裡~
(旁白:什麼堆?火堆?)
噗~!是堆棧的堆,旁白别打岔~
怎麼做呢?這樣: char* chValue = new char[8];
好簡單的樣子~但是,别忘記了,用完這個傳回值之後要釋放記憶體,不然你就等着記憶體溢出吧~
經曆這件事情之後,我決定和char*分手了,我不會再直接用它作為函數傳回值了~
2. 其實CCString很可愛
别忘了我們是在用Cocos2d-x的引擎,它可是有一套很不錯的記憶體管理機制的,幹嘛不用呢~于是,我把我的函數改成這樣:
const char* StringUtil::transIntToStr( int iValue ) {
return transIntToCCStr(iValue)->getCString();
}
CCString* StringUtil::transIntToCCStr( int iValue ) {
char chValue[8];
sprintf(chValue, "%d", iValue);
return CCString::createWithFormat(chValue);
}
(旁白:我噗,還不是一樣用char*傳回值~~)
忽略旁白。是的,我增加了一個函數,先獲得CCString傳回值,再取出char*對象,十分完美。我根本就不需要去釋放記憶體什麼的,Cocos2d-x會幫我這麼做~
希望能幫到和我一樣思維鎖死在Java裡的朋友。