共享指针

本页面的内容:

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

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

声明和初始化

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

创建新的共享指针示例:

// 创建空白的共享指针
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 ) );