当前位置: 首页 > 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:当需要避免循环引用,或访问但不控制对象的生命周期时。

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

http://www.lryc.cn/news/465119.html

相关文章:

  • 前端--深入理解HTTP协议
  • 线性代数 向量
  • go中阶乘实现时递归及迭代方式的比较
  • Jupyter notebook中更改字体大小
  • 关于Ubuntu服务器的时间同步设置以及Linux什么时候开始使用swap虚拟内存
  • Java Stream API 详解
  • 一文了解大模型中的SDK和API
  • element plus的el-select分页
  • STM32CubeMX【串口收发USART】
  • 【学术会议投稿】Java Web开发实战:从零到一构建动态网站
  • [Unity]内存优化
  • FreeRTOS工程创建,创建多任务程序,基于汇编对ARM架构的简单理解
  • C++STL--------list
  • M1 Mac打开Jupyter notebook
  • docker 仓库之harbor详解
  • 【环境变量】windons的Path
  • go语言里的切片
  • 革新你的智能体验:AIStarter 3.1.1正式版现已上线【安全认证】ai应用市场,数字人,ai绘画,ai视频,大模型,工作流因有尽有
  • 【练习17】数组中的最长连续子序列
  • 2024 最适合 Web 开发者的 9 款 Chrome 扩展
  • React综合指南(二)
  • XML\XXE漏洞基本原理
  • uniapp小程序自定义聚合点
  • Spring Boot在线考试系统:JavaWeb技术的应用案例
  • Linux在服务器多节点下面如何快速查找日志
  • 模数转换ADC0804的应用
  • CBAM中关于碳关税抵销
  • 2.5 windows xp,ReactOS系统快速系统调用的实现
  • AI助力广交会,人工智能在制造业有哪些应用场景?
  • ElementPlus-Table表格-单选--TypeScript进阶篇