笨木头  2012-12-06 22:03     Cocos2d-x,Cocos2d-x2.0     阅读(3953)     评论(2)
转载请注明,原文地址: http://www.benmutou.com/archives/39
文章来源:笨木头与游戏开发

木头 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里的朋友。

 

2 条评论
  • lmj 2014-05-07 17:14:55

    写的很好,搞Java的支持下。
    0回复
    • 博主 糟糕_树叶的mut 2014-05-07 17:25:12

      谢谢
      0回复
发表评论
粤ICP备16043700号

本博客基于 BlazorAnt Design Blazor 开发