Appearance
智能指针
为了能将指针释放交托给系统去处理而出现的功能。UE中有三种类型:共享指针,共享引用,弱指针。
名称 | 描述 |
---|---|
共享指针(TSharedPtr) | 引用计数的非侵入式的权威智能指针 |
共享引用(TSharedRef) | 不能设置为null值的、引用计数的、非侵入式权威智能指针 |
弱指针(TWeakPtr) | 引用计数的、非侵入式弱指针引用 |
自定义类常用,因为自定义类无法使用UPROPERTY宏
为了能够将内存释放交托给引擎,自定义类要继承自FGCObject,并重写父类函数AddReferencedObjects。
cpp
#pragma once
#include "CoreMinimal.h"
#include "GCObject.h"
// 自定义类要加F前缀
class UECPP_API FPClass:public FGCObject
{
public:
FPClass();
~FPClass();
protected:
UObject* p_Object;
protected:
virtual void AddReferencedObjects(FReferenceCollector& Collector) override;
}
void FPClass::AddReferencedObjects(FReferenceCollector& Collector)
{
Collector.AddReferencedObject(p_Object); // 将指针在垃圾回收器中标记为强引用,无法被回收
}
共享指针
cpp
// 声明和初始化
TSharedPtr<FNClass> pN;
TSharedPtr<FNClass> pN(new FNClass());
TSharedPtr<FNClass> pN = MakeShareable(new FNClass());
// MakeShareable函数用来构建共享指针的快捷方式
// 解引用和操作
pN->CallFun(); // 推荐使用这个
pN.Get()->CallFun();
(*pN).CallFun();
// 比较
TSharedPtr<FNClass> pN1;
TSharedPtr<FNClass> pN = MakeShareable(new FNClass());
if(pN1==pN){}
// 判断是否有效
TSharedPtr<FNClass> pN = MakeShareable(new FNClass());
if(pN.IsValid()){} // 判断是否为空,操作的函数是共享指针的成员函数
if(pN.Get() != nullptr) // 注意操作的函数是共享指针的成员函数