特点

经过上面几节课的学习,我们知道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。

RefPtr的bool函数用于返回RefPtr是否为null。

RefPtr的reset函数用于将对象release。

RefPtr的swap函数用于将自己的对象和参数的对象进行交换,引用计数不变。

RefPtr的weakAssign函数将自己的对象release,然后指向参数的对象。

RefPtr可以通过*或者get函数直接拿到对象的地址,拿到的地址即使Ref*,这个Ref*可以再加入Vector、Map等进行内存管理。

缺陷

RefPtr封装的Ref对象可以自己进行retain和release函数,这样会导致很多不确定性。比如Ref自己执行了release函数,那么在RefPtr运行析构函数的时候,就会出错。

RefPtr仍然可以对其weakAssign方法得到的Ref对象进行retain、release操作,如果进行了release操作,导致Ref被释放,那么在原智能指针处,如果使用这块内存,就会出错。