[置顶] Cocos2d-x 内存管理心得

前言:

    在C++中,在堆上分配动态内存和释放动态内存的方法是 new  delete,在申请内存之后,如果不使用了就需要delete掉,不然就会造成内存的溢出。附录:new的动态内存,只要在程序结束之前delete就行,这样在程序结束之前就可以把申请到的堆内存返还给系统,但是在实际的编程过程中,一般为了及时释放不用的空间提高内存的使用率而在不需要的位置调用delete来释放,以免造成内存占用过高和程序结束之前忘掉,从而造成的内存溢出。

         cosos2d-x中,对于引擎本身而言,自带了autorelease 方法,可以将对象的指针加入push到自动释放池中。在每一帧结束的时候调用pop对池中的对象指针执行 退出自动释放池,并且根据引用计数来实现自动释放。这一连串的动作,在看了几天的博客文章,“消化理解”后,发现把自己弄懵了。

    还是从头再来吧,接着从源码本身出发去理解,由于是在调试魔塔DEMO的时候出现了很多内存泄露提示(vs2010+ cocos2d-x 2.1.3 + VLD),本着坚决消化吸收cocos2d-x中的内存管理方法,重复调试了好多遍,现在来做个总结。

    首先,cocos2d-x官方推荐的生成对象方式 是使用CREATE_FUNC宏,宏中已经有一个autorelease()调用,所以只需要直接 className *pObject = className::create(),调用就行,小补充下:如果需要使用内存自动管理的功能,需要直接或间接继承CCObject类就行。当你加入以后,基本不需要对该对象的指针进行释放之类的操作,当然是没进行pObject->retain()(需要再执行pObject->release())操作。很方便的管理了需要在堆上分配的内存。推荐使用autorelease()来管理对内存的释放。

    其次,对于分配的内存有当前类数据成员和局部作用域中的局部对象的指针,类数据成员直接autorelease(),在类的生命周期结束时,类的析构函数中不需要再次释放了,因为引擎自动帮你释放了,对于局部的对象的指针,调用autorelease()后也不需要再次去释放了,都交给引擎去释放吧。

    最后,对于手动操作而言  new操作和delete操作成对出现就行,类数据成员则在析构函数中delete,以免提前释放了,造成内存操作错误。再者如果执行className *pObject = new className(); pObject->autorelease()亦可使用引擎的内存管理功能,前提是className 直接或间接继承自CCObject类。

    第一次写cocos2d-x内存管理的心得,请大家看着玩,参考了很多大神的内存管理博文,其中由于自己水平有限,没能好好理解,反而把自己弄晕了,着实对不起各位大神们的辛苦分享,再次感谢大神们分享的博文。。

    再次补充下,对于类成员使用create静态方法之后,建议retain下,因为在类对象的生命周期内不能释放掉,所以留到析构函数再release!

    希望此篇文章能给需要的朋友一点借鉴。。。

你可能感兴趣的:([置顶] Cocos2d-x 内存管理心得)