当前位置: 首页 > 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)…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

基于Springboot+Vue的办公管理系统

角色&#xff1a; 管理员、员工 技术&#xff1a; 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能&#xff1a; 该办公管理系统是一个综合性的企业内部管理平台&#xff0c;旨在提升企业运营效率和员工管理水…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...