Files
UnrealEngineUWP/Engine/Documentation/Source/Programming/UnrealArchitecture/SmartPointerLibrary/SharedPointer/SharedPointer.CHN.udn
Ben Marsh 49831a5631 Include documentation source in repository.
[CL 2489162 by Ben Marsh in Main branch]
2015-03-24 08:35:52 -04:00

90 lines
3.2 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 ) );