Cocos2d-x内存管理——读我所理解的cocos2d-x整理

来源:互联网 发布:淘宝零食店 知乎 编辑:程序博客网 时间:2024/05/28 11:30

C++显示堆内存管理

我们熟知的new和delete,手动进行,性能高,但容易出现
(1)野指针:指向已被释放的内存单元,该内存单元可能会重新被分配给其他对象。
(2)重复释放:重复释放一个已被释放的内存或者释放一个野指针。
(3)内存泄漏:没有释放不被使用的内存,不断操作会导致内存不断增加。

C++11提供智能指针,原理是将动态分配的内存单元和一个自动变量关联,自动变量是局部变量,离开作用域自动释放。
三种智能指针:
unique_ptr,独占内存所有权
shared_ptr,共享内存,采用引用计数,计数为0即释放内存
weak_ptr,可指向shared_ptr分配的对象内存,但不拥有该内存,用于检查shared_ptr的有效性。
智能指针缺点:性能损失(为保证线程安全加互斥锁)和显式声明。

Cocos2d-x的选择:
1、autorelease():将一个对象添加到一个AutoreleasePool中,每帧结束的时候AutoreleasePool对池中的每个对象执行一次release操作(retain增加引用计数,release减少引用计数),引用计数为0则清理对象。cocos通过create()方法调用autorelease()。
2、智能指针RefPtr< T >:T必须是Ref类型,类似shared_ptr,保持着一个Ref*对象的强引用,并使用cocos2d-x自身的引用计数来管理多个智能指针对内存的共享。比shared_ptr更轻量级但无法保证线程安全。通过weekAssign方法实现弱引用。

关于两者的总结:
如果RefPtr代替autorelease,那么任何一个对Node的资源引用都是强引用,这使当Node从UI树中移除时,还需要使用reset释放其对Node资源的占用,这显然是无法控制的。
如果autorelease代替RefPtr,由于autorelease完全依赖于自动回收池的释放,所以各个共享的变量几乎无法控制对资源的使用。
因此,对UI元素,使用autorelease来管理,而游戏中的数据则使用智能指针RefPtr来管理。

0 0