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

UE5里的TObjectPtr TSharedPtr TWeakPtr有什么区别

在 Unreal Engine(UE)编程中,TObjectPtr、TSharedPtr 和 TWeakPtr 都是 指针类型,但它们在生命周期管理和使用场景上有不同的特点。让我们详细分析这些指针的区别和用途。

TObjectPtr

TObjectPtr 是 UE5 中引入的新智能指针类型,专门用于 垃圾回收(GC)系统内的对象管理。

  1. 特点
    • 仅用于指向 UObject 类型的对象。
    • 轻量级,不管理对象生命周期(不增加引用计数)。
    • 指向的对象会自动由 UE 的垃圾回收系统管理。
    • 提供空指针检查和安全的对象访问。
  2. 用途
    • 用于需要指向 UObject 或其他由 UE 的 GC 处理的类(如组件、Actor等)。
    • 避免手动管理生命周期,比如在 UPROPERTY 中使用。
TObjectPtr<USceneComponent> MyComponent;
  1. 何时使用
    • 在 UObject 相关类内存管理的场景下,用于替代原生指针。

TSharedPtr

TSharedPtr 是一种 共享智能指针,用于管理在 多个对象间共享所有权 的指针。使用 引用计数 来控制对象生命周期。

  1. 特点
    • 当最后一个持有的 TSharedPtr 被销毁时,对象才会被释放。
    • 不适用于 UObject(因为它与 GC 管理冲突)。
    • 提供 线程安全 版本:TSharedPtr<…> 和 TSharedRef<…>。
  2. 用途
    • 在多个对象之间共享所有权,例如需要跨函数、类共享数据的非-UObject 类型。
TSharedPtr<FMyStruct> SharedData = MakeShared<FMyStruct>();
  1. 何时使用
    • 当多个对象需要共享数据,并且你希望自动管理其生命周期时。

TWeakPtr

TWeakPtr 是与 TSharedPtr 配合使用的 弱引用 指针,避免引用循环问题。它不会影响对象的引用计数。

  1. 特点
    • 不拥有对象的所有权,因此不会阻止对象被销毁。
    • 可通过 IsValid() 检查对象是否仍然存在,或通过 Pin() 将其转换为 TSharedPtr。
  2. 用途
    • 防止 循环引用(Circular References)。
    • 当你需要访问共享对象,但不确定其生命周期时。
TWeakPtr<FMyStruct> WeakData = SharedData;
if(IsValid(WeakData))
{//使用IsValid() 检查对象
}
if (TSharedPtr<FMyStruct> PinnedData = WeakData.Pin())
{// 使用 PinnedData 安全访问对象
}
  1. 何时使用
    • 在复杂的共享所有权结构中,避免循环引用导致的内存泄漏。

对比总结

指针类型生命周期管理用途场景使用限制 」
TObjectPtrUE 的垃圾回收(GC)系统管理UObject 相关类型(如 Actor、Component)只能用于 UObject 或其子类。
TSharedPtr共享所有权,引用计数多个对象共享非-UObject 数据不适用于 UObject 类型。
TWeakPtr无所有权,避免循环引用想访问但不拥有对象的场景必须配合 TSharedPtr 使用。

何时选择使用?

  1. TObjectPtr:当指向 UObject 类型,并且需要交给 UE 的垃圾回收系统管理时。常用于组件、Actor 等对象。
  2. TSharedPtr:当多个对象需要共享数据时,用于管理非 UObject 的生命周期。
  3. TWeakPtr:当需要避免循环引用,或访问但不控制对象的生命周期时。

通过根据指针的管理机制和你的需求选择合适的类型,你可以确保代码的安全性和性能表现。

相关文章:

UE5里的TObjectPtr TSharedPtr TWeakPtr有什么区别

在 Unreal Engine&#xff08;UE&#xff09;编程中&#xff0c;TObjectPtr、TSharedPtr 和 TWeakPtr 都是 指针类型&#xff0c;但它们在生命周期管理和使用场景上有不同的特点。让我们详细分析这些指针的区别和用途。 TObjectPtr TObjectPtr 是 UE5 中引入的新智能指针类型…...

前端--深入理解HTTP协议

HTTP 协议简介 HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;是一个应用层协议&#xff0c;用于在客户端&#xff08;通常是浏览器&#xff09;和服务器之间传输超文本数据&#xff08;如 HTML、CSS、JavaScript 等&#xff09;。它是万…...

线性代数 向量

一、定义 几何定义&#xff1a;向量是一个有方向和大小的量&#xff0c;通常用箭头表示。向量的起点称为原点&#xff0c;终点称为向量的端点。 代数定义&#xff1a;向量是一个有序的数组&#xff0c;通常表示为列向量或行向量。 行向量就是 1*n的形式&#xff08;行展开&…...

go中阶乘实现时递归及迭代方式的比较

package mainimport ("fmt""time""math/big" )// 使用递归和 big.Int 计算阶乘 func FactorialRecursive(n *big.Int) *big.Int {if n.Cmp(big.NewInt(0)) 0 {return big.NewInt(1)}return new(big.Int).Mul(n, FactorialRecursive(new(big.Int…...

Jupyter notebook中更改字体大小

文章目录 方法一&#xff1a;局部修改方法二&#xff1a;全局修改 Jupyter notebook提供了一个非常方便的跨平台交互代码编译环境&#xff0c;但是单元格的内的代码字体往往显示较小&#xff0c;不利于观看。本人查了很多方法来调整字体&#xff0c;后来发现既不需要更改jupyte…...

关于Ubuntu服务器的时间同步设置以及Linux什么时候开始使用swap虚拟内存

一、关于Ubuntu服务器的时间同步设置 首先我们检查一下服务器的时区设置和当前时间值&#xff0c;获取/etc/timezone 配置以及使用date命令查看当前时间。 rootiZ2ze7n2ynw18p6bs92fziZ:~# cat /etc/timezone Asia/Shanghai rootiZ2ze7n2ynw18p6bs92fziZ:~# date Wed Dec 21 …...

Java Stream API 详解

Java Stream API 详解 1. 什么是 Stream API&#xff1f; Stream API 是 Java 8 引入的一种用于处理集合&#xff08;如数组、列表&#xff09;的强大工具。它提供了一种声明性方式处理数据&#xff0c;可以简化代码并提高可读性。Stream 不是数据结构&#xff0c;它只是一种…...

一文了解大模型中的SDK和API

大白话聊SDK和API-知乎 1.智谱AI的SDK和API 以智谱AI为例&#xff0c;智谱AI的SDK是名为zhipuai的Python包&#xff0c;其中包含了用于访问API的接口&#xff08;如api-key&#xff09;。在这个框架中&#xff0c;API是SDK的一部分&#xff0c;用于实现与智谱AI服务的交互。 …...

element plus的el-select分页

摘要&#xff1a; el-select的数据比较多的时候&#xff0c;必须要分页&#xff0c;处理方案有全部数据回来&#xff0c;或者添加搜索功能&#xff0c;但是就有个问题就是编辑的时候回显问题&#xff0c;必须要保证select的数据有对应的id与name匹配回显&#xff01; <el-fo…...

STM32CubeMX【串口收发USART】

第一步&#xff0c;配置cubemx 配置好点右上角生成 第二步&#xff0c;串口方式 阻塞式发送 英文、中文正常、浮点有口 /* Initialize all configured peripherals */MX_GPIO_Init();MX_USART1_UART_Init();//配置完自动生成的 发送到串口助手上 while (1){/* USER CODE…...

【学术会议投稿】Java Web开发实战:从零到一构建动态网站

【会后3-4个月检索|IEEE出版】第五届人工智能与计算机工程国际学术会议&#xff08;ICAICE 2024&#xff09;_艾思科蓝_学术一站式服务平台 更多学术会议请看&#xff1a; https://ais.cn/u/nuyAF3 目录 引言 一、Java Web开发基础 1. Java Web开发简介 2. 开发环境搭建 …...

[Unity]内存优化

参考&#xff1a; Unity 内存优化 | 新诸子Unity内存优化&#xff08;来自uwa&#xff09; - weigang - 博客园Unity游戏内存优化——以TileMatch为例https://github.com/wechat-miniprogram/minigame-unity-webgl-transform/blob/main/Design/OptimizationMemory.mdunity内存…...

FreeRTOS工程创建,创建多任务程序,基于汇编对ARM架构的简单理解

FreeRTOS工程创建 下载STM32CubeMX尽量找网盘下载&#xff08;只是建议&#xff0c;没有说官网不行&#xff09; 1.创建 STM32CubeMX 工程 &#xff08;1&#xff09;双击运行 STM32CubeMX&#xff0c;在首页面选择“Access to MCU Selector”&#xff0c;如下图所示&#xff1…...

C++STL--------list

文章目录 一、list链表的使用1、迭代器2、头插、头删3、insert任意位置插入4、erase任意位置删除5、push_back 和 pop_back()6、emplace_back尾插7、swap交换链表8、reverse逆置9、merge归并10、unique去重11、remove删除指定的值12、splice把一个链表的结点转移个另一个链表13…...

M1 Mac打开Jupyter notebook

当我成功安装了Jupyter之后&#xff0c;发现无法通过 jupyter notebook 开始工作。 最初的问题是 zsh command not found 该问题是个路径问题&#xff0c;通过添加PATH环境变量就行了&#xff0c;设置环境变量时需要注意&#xff0c;zshrc和bash_profile中都可以设置&…...

docker 仓库之harbor详解

Harbor 是一个开源的企业级容器镜像仓库&#xff0c;由 VMware 提供。它基于 Docker 分布式应用程序框架构建&#xff0c;旨在解决企业对容器镜像存储、安全性和可管理性的需求。Harbor 提供了丰富的功能&#xff0c;包括用户权限管理、镜像复制、审计日志、漏洞扫描等&#xf…...

【环境变量】windons的Path

在 Windows 操作系统中&#xff0c;“Path” 是一个重要的环境变量&#xff0c;它定义了操作系统在执行命令时搜索可执行文件的目录。简而言之&#xff0c;当你在命令行&#xff08;例如 cmd 或 PowerShell&#xff09;中输入一个命令时&#xff0c;Windows 会查看 “Path” 环…...

go语言里的切片

package mainimport "fmt"func main() {// 创建一个长度为3&#xff0c;容量为5的整数切片var numbers make([]int, 3, 8)// 打印初始状态printSlice(numbers) // 输出: len3 cap5 slice[0 0 0]// 向切片添加元素numbers append(numbers, 1, 2)// 再次打印&#xf…...

革新你的智能体验:AIStarter 3.1.1正式版现已上线【安全认证】ai应用市场,数字人,ai绘画,ai视频,大模型,工作流因有尽有

在这个日新月异的技术时代里&#xff0c;人工智能&#xff08;AI&#xff09;正以前所未有的速度改变着我们的生活与工作方式。作为行业内的先锋之一&#xff0c;我们非常高兴地宣布&#xff1a;经过团队不懈努力以及严格的测试与优化后&#xff0c;AIStarter 3.1.1新版现已震撼…...

【练习17】数组中的最长连续子序列

数组中的最长连续子序列_牛客题霸_牛客网 (nowcoder.com) 题目分析&#xff1a;排序双指针 排序后&#xff0c;判断是否连续&#xff1a;后一个数-前一个数1 排序后&#xff0c;判断是否重复&#xff1a;后一个数-前一个数0 public class Solution {public int MLS (int[] arr)…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...