You've already forked UnrealEngineUWP
mirror of
https://github.com/izzy2lost/UnrealEngineUWP.git
synced 2026-03-26 18:15:20 -07:00
90 lines
3.2 KiB
Plaintext
90 lines
3.2 KiB
Plaintext
Availability:Public
|
||
Title:共享指针
|
||
Crumbs:%ROOT%, Programming, Programming/UnrealArchitecture/SmartPointerLibrary
|
||
Description: 智能指针支持共享所有权、自动失效、弱引用等。
|
||
|
||
[TOC(start:2)]
|
||
|
||
**共享指针** 是一种非侵入式的、引用计数的特殊类型智能指针,它既支持强引用也支持弱引用。共享指针本身包含了基本智能指针所有的优点,它们可以防止内存泄露、防止存在未初始化的内存等,同时还有一些额外功能,比如:
|
||
|
||
* 共享所有权 - 引用计数
|
||
* 自动失效 - 可以安全地引用易发生变化的对象
|
||
* 弱引用 - 允许通过[](Programming/UnrealArchitecture/SmartPointerLibrary/WeakPointer)避免产生引用循环。
|
||
* 针对程序员应用目的进行了改进 - 区分了拥有者和观察者,提供了不能为null的引用 ( [](Programming/UnrealArchitecture/SmartPointerLibrary/SharedReference) )
|
||
|
||
|
||
共享指针的一些基本特性:
|
||
|
||
* 非常强大的语法
|
||
* 非侵入式 (但可以反射)
|
||
* 线程安全 (某些条件下)
|
||
* 很好的性能,节约内存
|
||
|
||
|
||
## 声明和初始化
|
||
|
||
共享引用必须使用有效的对象进行初始化,且在声明时必须进行初始化。
|
||
|
||
创建新的共享指针示例:
|
||
|
||
// 创建空白的共享指针
|
||
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 ) );
|
||
|