可以看出TWeakObjectPtr是一个模板类,它继承自TWeakObjectPtrBase(一般默认为FWeakObjectPtr)。TWeakObjectPtr的模板参数T表示要引用的UObject派生类的类型,而模板参数TWeakObjectPtrBase表示实际弱引用实现的类型,也就是说TWeakObjectPtr实际上是FWeakObjectPtr的模版化包装。在Unreal中有很多的例子,当你看到TXXX的模板类...
1,2应该是Unreal使用Private继承来实现的原因,首先是这是符合语义,本质上TWeakObjectPtr是FWeakObjectPtr的一层模板包装,这也就是一种组合的实践方式,其二就是能够享受空基类优化来减少内存占用。对于3,4点来说,一是FWeakObjectPtr并没有虚函数,二是一般来说正常开发流程中不会再去继承TWeakObjectPtr了。所以在这里...
检查都通过再用返回的FUObjectItem检查其IsPendingKill标志与IsUnreachable,默认的Get函数参数是false的,所以既要UObject在GC时能够从根部搜索到,并且没有被标记清楚才返回最后的UObjectBase。 UObject* FWeakObjectPtr::Get(/*bool bEvenIfPendingKill = false*/) const { // Using a literal here allows theop...
Before accessing the object that a Weak Pointer references, you should use thePinfunction to produce a Shared Pointer. This guarantees that the object will continue to exist while you are using it. If you only need to establish whether or not the Weak Pointer references an object, you can c...
FORCEINLINE_DEBUGGABLE UObject* Internal_Get(bool bEvenIfPendingKill) const; int32 ObjectIndex; int32 ObjectSerialNumber; } Unreal的UObject管理 这里需要额外关注的就是ObjectIndex和ObjectSerialNumber字段,你可能会疑惑为什么只需要两个int32类型就可以了,甚至在FWeakObjectPtr中都不需要存储任何的UObject。这...
// Create a weak pointer to the new data object. TWeakPtr<FMyObjectType>ObjectObserver(ObjectOwner); 弱いポインタはオブジェクトの破棄を防止しません。たとえば、ObjectOwnerをリセットすると、ObjectObserverが依然としてスコープ内であるかどうかにかかわらずオブジェク...
struct FWeakObjectPtr { public: FORCEINLINE FWeakObjectPtr() { Reset(); } FORCEINLINE void Reset() { ObjectIndex = INDEX_NONE; ObjectSerialNumber = 0; } FWeakObjectPtr(const FWeakObjectPtr& Other) = default; FWeakObjectPtr& operator=(const FWeakObjectPtr& Other) = default; ...
struct FWeakObjectPtr { public: FORCEINLINE FWeakObjectPtr() { Reset(); } FORCEINLINE void Reset() { ObjectIndex = INDEX_NONE; ObjectSerialNumber = 0; } FWeakObjectPtr(const FWeakObjectPtr& Other) = default; FWeakObjectPtr& operator=(const FWeakObjectPtr& Other) = default; ...
第1、2点应该是Unreal使用Private继承来实现的原因,首先是符合语义,本质上TWeakObjectPtr是FWeakObjectPtr的一层模板包装,这也就是一种组合的实践方式;其二就是能够享受空基类优化来减少内存占用。对于第3、4点来说,一是FWeakObjectPtr并没有虚函数,二是一般来说正常开发流程中不会再去继承TWeakObjectPtr了。所以在...
Weak Object Pointer. This is similar to pointers likeUObject*, except that we tell the engine that we don’t want to hold onto the memory or object if we are the last piece of code referencing it. UObjects are automatically destroyed and garbage collected when no code is holding a (hard...