Cocos2d-X的内存管理(3)

2015年03月22日 16:30 0 点赞 0 评论 更新于 2025-11-21 18:10

特点

经过前面几节课的学习,我们了解到Cocos2d-x的内存管理可以借助AutoReleasePool、Vector和Map来实现。这三者本质上都属于容器的范畴。那么,Cocos2d-x的元素能否自行管理自身的内存呢?答案是肯定的,这就涉及到RefPtr,它是Cocos2d-x中一种类似于shared_ptr指针的智能指针。该指针会对一个Ref*保持强引用,并且在RefPtr封装的函数里,会通过Cocos2d-x中Refretainrelease方法来对Ref进行内存管理。

RefPtr借鉴了shared_ptr的理念,实现了与shared_ptr基本相同的功能,但它没有进行线程保护,从而避免了因线程保护带来的性能损失。

构造函数

RefPtr的构造函数会对所有非NULL的对象调用retain方法。不过,如果传入的参数是右值,则不会进行retain操作。

赋值操作符

RefPtr的赋值操作符会先对之前持有的对象调用release方法,然后对新传入参数的对象调用retain方法。同样,如果传入的参数是右值,就不会进行retain操作。

bool函数

RefPtr的bool函数用于判断RefPtr是否为null

reset函数

RefPtr的reset函数用于释放当前持有的对象。

swap函数

RefPtr的swap函数用于将自身持有的对象与参数中的对象进行交换,交换过程中对象的引用计数保持不变。

weakAssign函数

RefPtr的weakAssign函数会先释放自身持有的对象,然后指向参数所提供的对象。

获取对象地址

RefPtr可以通过*操作符或者get函数直接获取对象的地址,获取到的地址类型为Ref*。这个Ref*可以进一步添加到Vector、Map等容器中进行内存管理。

缺陷

手动调用retain和release

RefPtr封装的Ref对象可以手动调用retainrelease函数,这会带来很多不确定性。例如,若Ref对象自行调用了release函数,当RefPtr执行析构函数时,就可能会出错。

对weakAssign对象操作

RefPtr仍然可以对通过weakAssign方法得到的Ref对象进行retainrelease操作。如果进行了release操作并导致Ref对象被释放,那么在原智能指针处若继续使用这块内存,就会引发错误。

作者信息

menghao

menghao

共发布了 3994 篇文章