内容纲要

虚幻引擎为 C++ 设计的,能跨平台,更加适配虚幻引擎,主要用途是减轻内存分配和追踪的负担。实现包括行业标准的共享指针弱指针唯一指针。还可以添加共享引用,此类引用的行为与不可为空的共享指针相同。
适合游戏代码的单独内存追踪系统,无法和 UObject 系统同时使用。

  • 共享指针(TSharedPtr)
    适用情形:共享指针拥有其引用的对象,无限防止该对象被删除,并在无共享指针或共享引用(见下文)引用其时,最终处理其的删除。共享指针可为空白,意味其不引用任何对象。任何非空共享指针都可对其引用的对象生成共享引用。

  • 共享引用(TSharedRef)

(ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/SmartPointerLibrary/SharedReference)

适用情形:共享引用的行为与共享指针类似,即其拥有自身引用的对象。对于空对象而言,其存在不同;共享引用须固定引用非空对象。共享指针无此类限制,因此共享引用可固定转换为共享指针,且该共享指针固定引用有效对象。要确认引用的对象是非空,或者要表明共享对象所有权时,请使用共享引用。

  • 弱指针(TWeakPtrTSharedPtr

(ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/SmartPointerLibrary/WeakPointer)

适用情形:弱指针类与共享指针类似,但不拥有其引用的对象,因此不影响其生命周期。此属性中断引用循环,因此十分有用,但也意味弱指针可在无预警的情况下随时变为空。因此,弱指针可生成指向其引用对象的共享指针,确保程序员能对该对象进行安全临时访问。

  • 唯一指针(TUniquePtr)
    适用情形:唯一指针仅会显式拥有其引用的对象。仅有一个唯一指针指向给定资源,因此唯一指针可转移所有权,但无法共享。复制唯一指针的任何尝试都将导致编译错误。唯一指针超出范围时,其将自动删除其所引用的对象。

优点

  1. 防止内存泄漏

共享引用不存在时,智能指针(弱指针除外)会自动删除对象。

  1. 弱引用

弱指针会中断引用循环并阻止悬挂指针。

  1. 可选择的线程安全

虚幻智能指针库包括线程安全代码,可跨线程管理引用计数。如无需线程安全,可用其换取更好性能。

  1. 运行时安全

共享引用从不为空,可固定随时取消引用。

  1. 授予意图

可轻松区分对象所有者和观察者。

  1. 内存

智能指针在64位下仅为C++指针大小的两倍(加上共享的16字节引用控制器)。唯一指针除外,其与C++指针大小相同。