引用计数类
默认的Deleter:
template <typename Type>
struct DefaultDeleter
{
FORCEINLINE void operator()(Type* Object) const
{
delete Object;
}
};
引用计数的构造器, 分为带默认Deleter和自定义Deleter的版本 :
/** Creates a reference controller which just calls delete */
template <typename ObjectType>
inline FReferenceControllerBase* NewDefaultReferenceController(ObjectType* Object)
{
return new TReferenceControllerWithDeleter<ObjectType, DefaultDeleter<ObjectType>>(Object, DefaultDeleter<ObjectType>());
}
/** Creates a custom reference controller with a specified deleter */
template <typename ObjectType, typename DeleterType>
inline FReferenceControllerBase* NewCustomReferenceController(ObjectType* Object, DeleterType&& Deleter)
{
return new TReferenceControllerWithDeleter<ObjectType, typename TRemoveReference<DeleterType>::Type>(Object, Forward<DeleterType>(Deleter));
}
基类FReferenceControllerBase
class FReferenceControllerBase
{
public:
// 这些引用计数器是32位值(而不是16位以节省内存)的主要原因是原子操作至少需要32位对象
/* 对该对象的共享引用数. 当此计数达到零时,关联对象将被销毁(即使仍然存在弱引用)*/
int32 SharedReferenceCount;
/* 对该对象的弱引用数. 如果有任何共享引用, 那也算作一个弱引用 */
int32 WeakReferenceCount;
private:
FReferenceControllerBase( FReferenceControllerBase const& );
FReferenceControllerBase& operator=( FReferenceControllerBase const& );
};
子类TReferenceControllerWithDeleter, 是实际上实例化的类, 继承自FReferenceControllerBase
template <typename ObjectType, typename DeleterType>
class TReferenceControllerWithDeleter : private DeleterType, public FReferenceControllerBase
{
public:
virtual void DestroyObject() override
{
(*static_cast<DeleterType*>(this))(Object);
}
private:
/** The object associated with this reference counter. */
ObjectType* Object;
};
可以看到, 在DestroyObject里去释放引用的对象, 如果使用了默认的Deleter, 则直接delete Object.
操作类FReferen