1.共享引用是一直有效的 ,不能设置为NULL
2.共享引用必须使用效的对象进行初始化,
3.创建的时候必须初始化
4.共享引用是非常安全的,它不会突然间被置能NULL,它不可能被能NULL
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "TaskActor.generated.h"
class TaskA
{
public:
int32 a;
};
UCLASS()
class SLATEPROJECT_API ATaskActor : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
ATaskActor();
void TaskTSharedPtr();
void TaskTSharedRef();
void TaskTSharedRefAndPtr();
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
TSharedPtr Task_a;
//TSharedRef Task_b;//这种做法是错误的 无法编译通过的
};
void ATaskActor::TaskTSharedPtr()
{
Task_a = MakeShareable(new TaskA());
if (Task_a.IsValid()|| Task_a.Get())
{
Task_a->a;
Task_a.Get()->a;
Task_a.Reset();
}
}
void ATaskActor::TaskTSharedRef()
{
TSharedRef Task_b(new TaskA());
Task_b->a;
(*Task_b).a;
}
void ATaskActor::TaskTSharedRefAndPtr()
{
TSharedRef Task_b(new TaskA());
Task_a = Task_b;//共享引用转换成共享指针 是隐式转换
TaskA* NewTaskA = new TaskA();
Task_a = MakeShareable(NewTaskA);//普通指针转换成共享指针
Task_b = Task_a.ToSharedRef();//共享指针转换成共享引用是不安全的,一旦对象为空就会触发断言导致程序崩溃
//
// // NOTE: The following is an Unreal extension to standard shared_ptr behavior
// FORCEINLINE TSharedRef< ObjectType, Mode > ToSharedRef() const
// {
// // If this assert goes off, it means a shared reference was created from a shared pointer that was nullptr.
// // Shared references are never allowed to be null. Consider using TSharedPtr instead.
// check(IsValid());
// return TSharedRef< ObjectType, Mode >(*this);
// }
// Task_b = nullptr;//这个是错误的不能设置为nullptr
}



