天天看點

【木頭Cocos2d-x 021】一個堆和棧引起的分手事件

【木頭 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裡的朋友。

繼續閱讀