Language:
Page Info
Tags:
Engine Version:
The translation of this page is out of date. Please see the English version for the latest version of the page.

シェアード ポインタ

シェアードポインタ は、非侵入型、参照カウントのスマートポインタの特別なタイプで、強い参照と弱い参照の両方をサポートします。シェアードポインタは本質的に、スマートポインタの全ての基本的なメリットを持ち、メモリーリークやメモリが初期化されないことなどを防ぎます。同時に以下のような機能もあります。

  • 共有のオーナーシップ - 参照カウント

  • 自動無効化 - volatile なオブジェクトを安全に参照できます。

  • 弱い参照 - 弱いポインタ を介して循環参照を回避します。

  • プログラマの目的表示の改善 - オブザーバーとオーナーを区別し、non-nullable 型の参照を提供します。( 共有の参照 )

シェアードポインタのその他の基本性質

  • 非常に堅牢なシンタックス

  • 非侵入型 (しかしリフレクションは可能)

  • スレッドセーフ (条件付き)

  • 優れたパフォーマンス、メモリへの負担が軽減

宣言と初期化

共有の参照は常に有効なオブジェクトで初期化され、初期化せずに宣言することはできません。

新規シェアードポインタの作成例:

// 空のシェアードポインタを作成
TSharedPtr<FTreeNode> EmptyNode;

// 新規オブジェクトにシェアードポインタを作成
TSharedPtr<FTreeNode> Node( new FTreeNode() );

2 番めの例では、新しい 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 ) );