【UE4 C++】UObject 创建、销毁、内存管理
UObject 的创建
NewObject 模板类
本例使用 UE 4.26,只剩下 NewObject 用来创建 UObject,提供两个带不同可选参数构造函数的模板类
Outer 表示这个对象的外部对象,通常可传 this 指针进去
Name 为对象名,如果没有自定义,默认生成,自带 GetName() 方法获取
template<class T>
T* NewObject(UObject* Outer)
{
T* Object = ::NewObject<T>(Outer);
Object->SetInternalFlags(EInternalObjectFlags::Async);
return Object;
} template<class T>
T* NewObject(UObject* Outer, UClass* Class, FName Name = NAME_None,
EObjectFlags Flags = RF_NoFlags, UObject* Template = nullptr,
bool bCopyTransientsFromClassDefaults = false, FObjectInstancingGraph* InInstanceGraph = nullptr)
{
T* Object = ::NewObject<T>(Outer, Class, Name, Flags, Template, bCopyTransientsFromClassDefaults, InInstanceGraph);
Object->SetInternalFlags(EInternalObjectFlags::Async);
return Object;
}
实践
创建一个 UObject 类
UCLASS()
class TIPS_API UItemObject : public UObject
{
GENERATED_BODY()
FString m_Name;
public:
UItemObject() {
m_Name = GetName();
UE_LOG(LogTemp, Warning, TEXT(__FUNCTION__" %s"), *m_Name);
} ~UItemObject() { UE_LOG(LogTemp, Warning, TEXT(__FUNCTION__" %s"), *m_Name); }
};
创建 UObject 实例
UItemObject* Obj = NewObject<UItemObject>();
UItemObject* Obj2 = NewObject<UItemObject>(this, TEXT("Obj2"));
UObject 的销毁
自动销毁
UObject及其派生 具有被 UE4 垃圾回收机制管理,因而当指向对象的指针为 nullptr 后,将会被 UE4 自动回收掉
Obj = NewObject<UItemObject>(this, TEXT("Obj"));
Obj = nullptr;
主动销毁
UObject::ConditionalBeginDestroy()
- 异步执行且对象在当前帧内持续有效
- 等待下次GC
Obj->ConditionalBeginDestroy();
Obj = nullptr;
MarkPendingKill()
- 标记为PendingKill,等待回收。指向此实例的指针将设置为NULL,并在下一次GC时删除。
- IsPendingKill 判断是否处于 PendingKill 状态
- ClearPendingKill 清除 PendingKill 状态
Obj->MarkPendingKill();
Obj = nullptr;
Engine\Config \BaseEngine.ini 更改下面参数,设置销毁时间间隔
gc.TimeBetweenPurgingPendingKillObjects=60
强制垃圾回收
UWorld::ForceGarbageCollection 弃用
GEngine->ForceGarbageCollection
GEngine->ForceGarbageCollection(true);
原生对象内存管理
new/delete
需要手动清理,易造成内存泄漏
delete 一般将指针置为 nullptr ,防止指向的地址不固定
class SimpleObject {
public:
SimpleObject() { UE_LOG(LogTemp, Warning, TEXT(__FUNCTION__)); }
~SimpleObject() { UE_LOG(LogTemp, Warning, TEXT(__FUNCTION__)); }
};
SimpleObject* Obj = new SimpleObject(); delete Obj;
Obj = nullptr;

使用智能指针
- 对于非 UObject 的对象,可以使用智能指针进行管理
- 当引用计数为0时,对象自动销毁
UObject 对象内存管理
UPROPERTY() 保持引用
支持容器 TArray、TMap 的 <UObject*>类型。TArray、TMap使用UPROPERTY() ,也可以使元素对象常驻内存
UPROPERTY()
class UItemObject* m_ItemObject2; UPROPERTY()
TArray<class UItemObject*> m_ObjList1;
AddToRoot 和 RemoveFromRoot 标记不被GC/移除标记
构造时 和 AddToRoot 一起
析构时和 RemveFromRoot 一起
//创建对象
m_ItemObject1 = NewObject<UItemObject>(this,TEXT("m_ItemObject1"));
m_ItemObject1->AddToRoot(); // 释放对象
m_ItemObject1->RemoveFromRoot();
m_ItemObject1 = nullptr;

FStreamableManager 资源卸载
FStreamableHandle::ReleaseHandle()TSharedPtr<FStreamableHandle> Handle = UAssetManager::GetStreamableManager().RequestSyncLoad(AssetPath);
UObject* Obj = Handle->GetLoadedAsset();
Handle->ReleaseHandle();
AActor 销毁
Destroy()方法
UActorComponent
DestroyComponent()方法
扩展:FGCObjectScopeGuard
【UE4 C++】UObject 创建、销毁、内存管理的更多相关文章
- UIView的创建与内存管理
学习过程中遇到一些问题,现在记录下来,以后忘记以便翻看. 创建工程的步骤: xcode的ARC改为MRC .h文件中的strong改为retain .m文件中加入dealloc方法 .m文件中_win ...
- 关于Image创建的内存管理
image创建方法 [UIImage imageNamed:imageName] 上述方法创建的image,会常驻在内存中,不会随着imageView的dealloc而释放内存. NSString * ...
- Object-c 内存管理
内存管理 主要内容 1.内存管理的概念 2.引用计数 3.如何持有对象所有权 4.自动释放池 5.@property的使用 什么是内存管理 内存管理是关于如何管理对象生 ...
- nginx源码分析—内存池结构ngx_pool_t及内存管理
Content 0. 序 1. 内存池结构 1.1 ngx_pool_t结构 1.2 其他相关结构 1.3 ngx_pool_t的逻辑结构 2. 内存池操作 2.1 创建内存池 2.2 销毁内存池 2 ...
- TaskTracker节点上的内存管理器
Hadoop平台的最大优势就是充分地利用了廉价的PC机,这也就使得集群中的工作节点存在一个重要的问题——节点所在的PC机内存资源有限(这里所说的工作节点指的是TaskTracker节点),执行任务时常 ...
- 内存管理运算符new delete与内存管理函数malloc free的区别——已经他们对对象创建的过程。
(1)内存管理函数与内存管理运算符的区别 内存管理函数有内存分配函数,malloc calloc realloc 以及内存释放函数free. 内存管理运算符有new 和delete. 两种内存管理方式 ...
- BBS项目详解(forms快速创建登陆页面,登陆验证、通过阅读器进行头像上传的预览、内存管理器)
BBS项目涉及的知识点 django中知识点 钩子函数(局部钩子和全局钩子) 1.局部钩子就是用来做合法性校验,比如用户名有没有被使用等 2.全局的就是用来做对比校验,比如两次输入的密码是否一致 3. ...
- 使用虚幻引擎中的C++导论(四-内存管理与垃圾回收)(终)
使用虚幻引擎中的C++导论(四)(终) 第一,这篇是我翻译的虚幻4官网的新手编程教程,原文传送门,有的翻译不太好,但大体意思差不多,请支持我O(∩_∩)O谢谢. 第二,某些细节操作,这篇文章省略了,如 ...
- Objective-C内存管理之引用计数
初学者在学习Objective-c的时候,很容易在内存管理这一部分陷入混乱状态,很大一部分原因是没有弄清楚引用计数的原理,搞不明白对象的引用数量,这样就当然无法彻底释放对象的内存了,苹果官方文档在内存 ...
随机推荐
- junit5 yaml和json 数据驱动
使用yaml 数据驱动测试 新建用例数据类,用于动态修改测试数据 对应yaml文件,第一层结构为列表 第二层结构为具体序列化class对象 测试成功 public class TestYaml { @ ...
- 2.设计模式常用的UML图分析(用例图、类图与时序图)
1-用例图 概述 展现了一组用例.参与者以及他们之间的关系. 用例图从用户角度描述系统的静态使用情况,用于建立需求模型. 用例特征 保证用例能够正确捕捉功能性需求,判断用例是否准确的依据. 用例是动宾 ...
- go中语句为什么不用加分号;结束
不用人加 编译的时候自动加了分号; 编译器工作原理 首先,在一行中,寻找成对的符号,比如一对字符串的引号.一对圆括号,一对大括号 上述任务完成后,在一行中没有其他成对的标示,然后就在行尾追加分号; 所 ...
- 使用Dockerfile Maven插件
我们常见开源项目中使用的Docker Maven插件是com.spotify:docker-maven-plugin.可用版本信息见Github. 通过其介绍可知该插件已经不再推荐使用,取而代之的是c ...
- FastAPI(6)- get 请求 - 详解 Query
可选参数 上一篇文章讲过查询参数可以不是必传的,可以是可选参数 from fastapi import FastAPI from typing import Optional import uvico ...
- 288 day05_异常,线程
day05 [异常.线程] 主要内容 异常.线程 教学目标 [ ] 能够辨别程序中异常和错误的区别 [ ] 说出异常的分类 [ ] 说出虚拟机处理异常的方式 [ ] 列举出常见的三个运行期异常 [ ] ...
- CentOS安装oh-my-zsh并配置语法高亮和命令自动补全
安装zsh 和 oh-my-zsh 安装zsh yum install zsh 安装git yum install git 切换默认shell chsh -s /bin/zsh clone from ...
- CodeForce-797C Minimal string(贪心模拟)
Minimal string CodeForces - 797C Petya 收到一个长度不超过 105 的字符串 s.他拿了两个额外的空字符串 t 和 u 并决定玩一个游戏.这个游戏有两种合法操作: ...
- 【PHP数据结构】图的概念和存储结构
随着学习的深入,我们的知识也在不断的扩展丰富.树结构有没有让大家蒙圈呢?相信我,学完图以后你就会觉得二叉树简直是简单得没法说了.其实我们说所的树,也是图的一种特殊形式. 图的概念 还记得我们学习树的第 ...
- 深入剖析RocketMQ源码-NameServer
一.RocketMQ架构简介 1.1 逻辑部署图 (图片来自网络) 1.2 核心组件说明 通过上图可以看到,RocketMQ的核心组件主要包括4个,分别是NameServer.Broker.Produ ...