Cocos2d-X的内存管理(3)
特点
经过前面几节课的学习,我们了解到Cocos2d-x的内存管理可以借助AutoReleasePool、Vector和Map来实现。这三者本质上都属于容器的范畴。那么,Cocos2d-x的元素能否自行管理自身的内存呢?答案是肯定的,这就涉及到RefPtr,它是Cocos2d-x中一种类似于shared_ptr指针的智能指针。该指针会对一个Ref*保持强引用,并且在RefPtr封装的函数里,会通过Cocos2d-x中Ref的retain和release方法来对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对象可以手动调用retain和release函数,这会带来很多不确定性。例如,若Ref对象自行调用了release函数,当RefPtr执行析构函数时,就可能会出错。
对weakAssign对象操作
RefPtr仍然可以对通过weakAssign方法得到的Ref对象进行retain和release操作。如果进行了release操作并导致Ref对象被释放,那么在原智能指针处若继续使用这块内存,就会引发错误。