|
本页面的内容:
声明和初始化
解引用和访问
比较
转换
共享指针 是一种非侵入式的、引用计数的特殊类型智能指针,它既支持强引用也支持弱引用。共享指针本身包含了基本智能指针所有的优点,它们可以防止内存泄露、防止存在未初始化的内存等,同时还有一些额外功能,比如:
共享所有权 - 引用计数
自动失效 - 可以安全地引用易发生变化的对象
弱引用 - 允许通过弱指针避免产生引用循环。
针对程序员应用目的进行了改进 - 区分了拥有者和观察者,提供了不能为null的引用 ( 共享引用 )
共享指针的一些基本特性:
非常强大的语法
非侵入式 (但可以反射)
线程安全 (某些条件下)
很好的性能,节约内存
声明和初始化
共享引用必须使用有效的对象进行初始化,且在声明时必须进行初始化。
创建新的共享指针示例:
// 创建空白的共享指针TSharedPtrFTreeNode EmptyNode;// 创建共享指针到新对象TSharedPtrFTreeNode Node( new FTreeNode() );
在第二个示例中,新的FTreeNode对象实际由指向它的共享指针所有。当共享指针离开效果域时,该对象将会销毁。
当您复制一个共享指针时,会添加一个到其所指向的对象的引用。
TSharedPtrFTreeNode OtherNodeRef = Node;
该对象将会持续存在,直到没有共享指针引用它为止。
通过使用 Reset() 方法或通过赋予NULL值,可以重置共享指针。
Node.Reset();Node = NULL;解引用和访问
解引用、调用方法及访问成员的操作方式和您处理常规的C++指针的方式一样。
Node-ListChildren();Node.Get()-ListChildren();( *Node ).ListChildren();比较
您可以判断共享指针是否相等,也就是,判断它们是否指向同一个对象。
TSharedPtrFTreeNode NodeA, NodeB;if( NodeA == NodeB ){ ...}
通过使用 IsValid() 方法或者通过访问原始指针并执行比较,可以判断共享指针是否为NULL。
if( Node.IsValid() ){ ...}if( Node.Get() != NULL ){ ...}转换
共享指针不能进行隐式转换,因为这样做非常危险。比如,以下代码将不能编译:
TSharedPtrfloat Height = 45.0f;
但是,可以使用 MakeShareable() 方法进行显式转换。
TSharedPtrfloat Height = MakeShareable( new float( 45.0f ) ); |
|