Language:
Share
此中文页面内容对应的英文页面有后续更新,如需浏览最新文档可切换至英文页面浏览。

共享指针

共享指针 是一种非侵入式的、引用计数的特殊类型智能指针,它既支持强引用也支持弱引用。共享指针本身包含了基本智能指针所有的优点,它们可以防止内存泄露、防止存在未初始化的内存等,同时还有一些额外功能,比如:

  • 共享所有权 - 引用计数

  • 自动失效 - 可以安全地引用易发生变化的对象

  • 弱引用 - 允许通过弱指针 避免产生引用循环。

  • 针对程序员应用目的进行了改进 - 区分了拥有者和观察者,提供了不能为null的引用 ( 共享引用 )

共享指针的一些基本特性:

  • 非常强大的语法

  • 非侵入式 (但可以反射)

  • 线程安全 (某些条件下)

  • 很好的性能,节约内存

声明和初始化

共享引用必须使用有效的对象进行初始化,且在声明时必须进行初始化。

创建新的共享指针示例:

// 创建空白的共享指针
TSharedPtr<FTreeNode> EmptyNode;

// 创建共享指针到新对象
TSharedPtr<FTreeNode> Node( new FTreeNode() );

在第二个示例中,新的FTreeNode对象实际由指向它的共享指针所有。当共享指针离开作用域时,该对象将会销毁。

当您复制一个共享指针时,会添加一个到其所指向的对象的引用。

TSharedPtr<FTreeNode> OtherNodeRef = Node;

该对象将会持续存在,直到没有共享指针引用它为止。

通过使用 Reset() 方法或通过赋予NULL值,可以重置共享指针。

Node.Reset();
Node = NULL;

解引用和访问

解引用、调用方法及访问成员的操作方式和您处理常规的C++指针的方式一样。

Node->ListChildren();
Node.Get()->ListChildren();
( *Node ).ListChildren();

比较

您可以判断共享指针是否相等,也就是,判断它们是否指向同一个对象。

TSharedPtr<FTreeNode NodeA, NodeB;

if( NodeA == NodeB )
{
    ...
}

通过使用 IsValid() 方法或者通过访问原始指针并执行比较,可以判断共享指针是否为NULL。

if( Node.IsValid() )
{
    ...
}

if( Node.Get() != NULL )
{
    ...
}

转换

共享指针不能进行隐式转换,因为这样做非常危险。比如,以下代码将不能编译:

TSharedPtr<float> Height = 45.0f;

但是,可以使用 MakeShareable() 方法进行显式转换。

TSharedPtr<float> Height = MakeShareable( new float( 45.0f ) );