当前位置: 首页 > article >正文

UE 5.3 C++ 对垃圾回收的初步认识

一.UObject的创建

UObject 不支持构造参数。

所有的C++ UObject都会在引擎启动的时候初始化,然后引擎会调用其默认构造器。如果没有默认的构造器,那么 UObject 将不会编译。

有修改父类参数的需求,就使用指定带参构造

	// Sets default values for this actor's properties
	AMyActor();
	// 
	AMyActor(const FObjectInitializer& ObjectInitializer);

创建

1. NewObject<T>();

虚幻会管理,它重载了new 和 delete。

	myObject =  NewObject<UBaseObject>();

2.     CreateDefaultSubobject<T>();

RootComponent = CreateDefaultSubobject<USceneComponent>("Root");

只是上一个更通用,下面这个在构造函数里才使用,来创建和管理组件。

二.测试垃圾回收

在你Actor的头文件的中,声明一个UObject·。

UCLASS()
class MYPROJECT_API UBaseObject :public UObject
{
	GENERATED_BODY()
public:
	UBaseObject();
	UBaseObject(const FObjectInitializer& ObjectInitializer);
	virtual ~UBaseObject();
	int32 Health = 666;
};

并在Actor里声明它。

public:	
	// Called every frame
	virtual void Tick(float DeltaTime) override;
	UFUNCTION(BlueprintCallable)
	void InitBaseObject();
	UFUNCTION(BlueprintCallable)
	int32 GetBaseObjectHealth();

	//为了避免对象被回收
	//UPROPERTY()  //有对象引用了,就不会被回收
	UBaseObject* myObject = nullptr;
};

CPP里实现

void AMyActor::InitBaseObject()
{
	myObject =  NewObject<UBaseObject>();
	myObject->AddToRoot();
}

int32 AMyActor::GetBaseObjectHealth()
{
	if (myObject)
	{
		return myObject->Health;
	}
	return -1;
}


UBaseObject::UBaseObject()
{
	UE_LOG(LogTemp, Warning, TEXT("初始化了"));

}

UBaseObject::UBaseObject(const FObjectInitializer& ObjectInitializer)
{
	UE_LOG(LogTemp, Warning, TEXT("初始化了2"));
}

UBaseObject::~UBaseObject()
{
	UE_LOG(LogTemp, Warning, TEXT("垃圾回收"));
}

测试

一旦按下3,垃圾回收。自己的UObject就会被回收掉。

解决方案,加上UPOPERTY,让它被对象引用。

	//为了避免对象被回收
	UPROPERTY()  //有对象引用了,就不会被回收
	UBaseObject* myObject = nullptr;

AddtoRoot,强制不被回收。和允许回收。少用这个方法。

void AMyActor::InitBaseObject()
{
	myObject =  NewObject<UBaseObject>();
	myObject->AddToRoot();
}

注:标记UPROPERTY 会自动加入root set 阻止垃圾回收

一个Up标记object类指针变量,当指向null时,object会进行析构,自动进行垃圾回收

一个非标记的object类变量,当未添加AddToRoot时,会被下一次垃圾回收,留下野指针。

你通常需要保持对希望保持活跃的任何Object的`UPROPERTY`引用,或者将指向它的指针存储在`TArray`或其他引擎容器类中。


http://www.kler.cn/a/529793.html

相关文章:

  • C语言:链表排序与插入的实现
  • MQTT知识
  • MongoDB深度解析与实践案例
  • C++ 泛型编程指南02 (模板参数的类型推导)
  • 【Python】第七弹---Python基础进阶:深入字典操作与文件处理技巧
  • Windsurf cursor vscode+cline 与Python快速开发指南
  • 纯后训练做出benchmark超过DeepseekV3的模型?
  • 1.[安洵杯 2019]easy_web1
  • 标准IO与文件IO 进程与线程
  • 如何实现一个CLI命令行功能 | python 小知识
  • 低代码系统-产品架构案例介绍、炎黄盈动-易鲸云(十二)
  • PHP 常用函数2025.02
  • 《苍穹外卖》项目学习记录-Day10Spring Task
  • [ESP32:Vscode+PlatformIO]新建工程 常用配置与设置
  • 2025 年 YOLO 十大未来应用场景
  • LeetCode:121.买卖股票的最佳时机1
  • MoonBit 编译器(留档学习)
  • SAP HCM insufficient authorization, no.skipped personnel 总结归纳
  • 【含文档+PPT+源码】基于微信小程序的社区便民防诈宣传系统设计与实现
  • React中使用箭头函数定义事件处理程序
  • 小红的小球染色期望
  • 武汉科技大学计算机课程设置,武汉科技大学计算机控制与接口技术课程实施方案
  • 笔灵ai写作技术浅析(四):知识图谱
  • 代理模式——C++实现
  • MVC 文件夹:架构之美与实际应用
  • 从零开始:用Qt开发一个功能强大的文本编辑器——WPS项目全解析