1.非UObject对象

即非UObject常规C++对象,创建销毁不赘述。但可以用智能指针;从而不用关心销毁逻辑:

TSharedPtr<ClassA> MyObj = MakeShareable(new ClassA());

智能指针转裸指针:

ClassA* MyObjPtr = MyObj.Get();

智能指针情况下,当别的类引用该对象,并要知道引用的字段是否=nullptr,则需使用弱指针(TWeakPtr):

class ClassB
{
public:
TWeakPtr<ClassA> ClassAReference;
};
ClassB ClassBObj;
ClassBObj.ClassAReference = MyObj;
//...
if (ClassBObj.ClassAReference.IsValid())
{
//...
}

2.场景引用的UObject对象

第二种是链接在场景中的UObject对象,UObject本身不会产生释放销毁问题,因为走的是UE自己的垃圾回收。

但有时会无法获取当前对象是否已销毁的状态。

例如:


UCLASS()
class AMyClass : public ACharacter
{
GENERATED_BODY() public:
class UActorComponent* TestUObj; //...

TestUObj没有加UPROPERTY,此时无法判断是否销毁:

TestUObj->DestroyComponent();//销毁测试

if (TestUObj)
UE_LOG(LogTemp, Log, TEXT("Not Destroy!"));//最后一定进到这里
else
UE_LOG(LogTemp, Log, TEXT("Destroyed!"));

回到刚刚的AMyClass,加上UPROPERTY宏,即可解决。UE会跟踪其生命周期:

UPROPERTY(VisibleAnywhere)//加上
class UActorComponent* TestUObj;

但如果不想用UPROPERTY又需要知道当前对象是否已销毁,则可以用弱对象指针TWeakObjectPtr

(TWeakObjectPtr和TWeakPtr弱指针的区别是,TWeakObjectPtr针对UObject对象,TWeakPtr针对常规C++对象):

TWeakObjectPtr<UActorComponent> ptr = MakeWeakObjectPtr(TestUObj);//弱对象指针
TestUObj->DestroyComponent();//销毁 if (ptr.IsValid())
{
UE_LOG(LogTemp, Log, TEXT("Not Destroy!"));
}
else
{
UE_LOG(LogTemp, Log, TEXT("Destroyed!"));//正常了
}

3.动态创建的UObject对象

动态创建的对象主要问题是,每隔一段时间对象就会自动被垃圾回收机制销毁,该问题通常会导致UE崩溃,并弹窗报错Pure Virtual Function。

这是因为动态创建的对象还要调用一下AddToRoot,才可避免被自动回收:

TestUObj = NewObject<UActorComponent>(this, TEXT("Dynamic Obj1"));
TestUObj->AddToRoot();

在释放时,还需手动调用RemoveFromRoot,否则UE会断言报错:

TestUObj->RemoveFromRoot();

4.UInterface接口对象的释放

除非是引用关系,UInterface也要留意销毁,而销毁时可以通过_getUObject拿到UObject进行操作。下例用其去调用RemoveFromRoot,

保证与AddToRoot的成对调用:

IMyInterface* myInterface;
myInterface->_getUObject()->RemoveFromRoot();

关于UE4对象静态/动态的销毁问题整理(AddToRoot、TWeakObjectPtr)的更多相关文章

  1. 不可或缺 Windows Native (19) - C++: 对象的动态创建和释放, 对象的赋值和复制, 静态属性和静态函数, 类模板

    [源码下载] 不可或缺 Windows Native (19) - C++: 对象的动态创建和释放, 对象的赋值和复制, 静态属性和静态函数, 类模板 作者:webabcd 介绍不可或缺 Window ...

  2. 静态/动态函数库设计,王明学learn

    静态/动态函数库设计 Linux应用程序设计中需要的外部函数主要由函数库和系统调用来提供. 两者区别: 一.函数库分类 函数库按照链接方式可分为: 1.静态链接库 对函数库的链接是放在编译时期(com ...

  3. [ Java学习基础 ] Java对象的创建和销毁

    类实例化可生成对象,实例方法就是对象方法,实例变量就是对象属性.一个对象的生命周期包括三个阶段:创建.使用和销毁. 创建对象 创建对象包括两个步骤:声明和实例化. 声明 声明对象与声明普通变量没有区别 ...

  4. JAVA静态&动态代理

    具体场景 为了使代理类和被代理类对第三方有相同的函数,代理类和被代理类一般实现一个公共的interface,该interface定义如下 public interface Calculator { p ...

  5. c++——对象的动态建立和释放(new 和delete)

    3.8 对象的动态建立和释放 1 new和delete基本语法 1)在软件开发过程中,常常需要动态地分配和撤销内存空间,例如对动态链表中结点的插入与删除.在C语言中是利用库函数malloc和free来 ...

  6. javascript里面的数组,json对象,动态添加,修改,删除示例

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  7. javascript如何解析json对javascript如何解析json对象并动态赋值到select列表象并动态赋值到select列表

    原文 javascript如何解析json对象并动态赋值到select列表 JSON(JavaScriptObject Notation)一种简单的数据格式,比xml更轻巧.JSON是JavaScri ...

  8. js对象中动态读取属性值 动态属性值 js正则表达式全局替换

    $(document).ready(function(){ var exceptionMsg = '${exception.message }'; var exceptionstr = ''; //j ...

  9. JavaScript高级 面向对象(11)--对象的动态特性-关联数组用法

    说明(2017.4.2): 1. 对象的动态特性: (1)在js中,一个对象需要属性,就可以利用“对象名.属性 = 值”的方式为其添加,只要赋值成功,对象就新增这个属性. (2)对象属性的访问形式: ...

  10. 面向对象银角大王补充2-self就是调用当前方法的对象-静态字段,公有属性-封装的理解-继承的理解,普通方法,静态方法

    self是什么,就是一个函数,就是一个形式参数 4.self就是调用当前方法的对象 静态字段,公有属性 静态字段使用场景,每个对象中保存相同的东西时,可以使用静态字段,公有属性 5.封装的理解 类中封 ...

随机推荐

  1. .net 发邮件的小工具,包含json,环境变量,命令行参数三种配置方式

    一.业务需求 在工作中遇到一个场景,软件bug或功能发布之后,会通知测试进行测试,要求写一个小工具能自动发送邮件,功能包含发送和抄送支持多个,因为只是通知没有写进附件功能,这个其他博客都有搜一下就可以 ...

  2. HAProxy适配openGauss使用指导书

    一.HAProxy 简介 HAProxy 是一个开源的项目,其代码托管在 Github 上,代码链接如下:HAProxy 代码链接. HAProxy 提供高可用性.负载均衡以及基于 TCP 和 HTT ...

  3. 一文带你详细了解HarmonyOS折叠屏设计规范!

    原文:https://mp.weixin.qq.com/s/G25IbfcX2Bq9s1IDPCELGw,点击链接查看更多技术内容. 随着新一代折叠屏手机HUAWEI Mate Xs 2发布,Harm ...

  4. k8s之hostPath存储卷

    一.简介 hostPath:用于将目录从工作节点的文件系统挂载到pod中. 数据的生命周期与节点相同.我们知道,虽然hostPath卷实现pod中数据存储到节点的文件系统中,但是pod的调度不是固定的 ...

  5. 单机运行环境搭建之 --CentOS-6.4安装MySQL 5.6.10并修改MySQL的root用户密码

    单机运行环境搭建之 --CentOS-6.4安装MySQL 5.6.10并修改MySQL的root用户密码 Mysql 5.5以后使用了CMake进行安装,参考与以前的区别请参考: http://ww ...

  6. jenkins 持续集成和交付——一个构件小栗子前置(三)

    前言 下面介绍构建一个小栗子. 在此之前有个小前提,就是已经安装好了git 服务器,用的是gogs,详细请看外篇. 正文 插件安装 首先你要安装一个git插件. 装完git插件后,我们还得安装一些gi ...

  7. vue使用 elementUI中el-upload的遇到的问题总结

    使用场景,使用el-upload上传文件,选择文件后不立即上传到服务器上,点击提交按钮时与其他form表单数据一起提交,类似的需求,相信有很多小伙伴遇到,可能也会遇到跟我一起的问题,在这里记录一下 & ...

  8. Crazy Excel:Excel中的泥石流

    Crazy Excel又名:疯狂Excel.是一款PC端的Excel软件工具,该软件支持windows, mac os等主流操作系统. 正如其名,作者在设计之初就加入了一些疯狂的设计,目的是创作出更加 ...

  9. 第壹課-Install:Mirth Connect在Win10下的安装步骤

    1.安装JDK,推荐安装JDK8 64位,版本jdk-8u201-windows-x64.exe. 安装JDK后,同时必须配置win10的系统环境变量[示例如下]: JAVA_HOME : F:\Ja ...

  10. 云原生时代 RocketMQ 运维管控的利器 - RocketMQ Operator

    作者 | 刘睿.杜恒 导读:RocketMQ Operator 现已加入 OperatorHub,正式进入 Operator 社区.本文将从实践出发,结合案例来说明,如何通过 RocketMQ Ope ...