弱いポインタ

弱い参照を格納してオブジェクトの破棄を防止しないスマート ポインタ

Windows
MacOS
Linux

弱いポインタ はオブジェクトに対する弱い参照を格納します。シェアード ポインタとは異なり、弱いポインタはオブジェクトの破棄を防止しません。弱いポインタは、ポインタのオブジェクトが破棄されるとオブジェクト破棄の原因がなんであれ自動的に空になります。そのため volatile オブジェクトに対してポインタを安全にキャッシュできます。これはつまり、弱いポインタは予期しないときに空になることがあり、弱いポインタは参照サイクルの中断に使用できることを意味します。

弱いポインタのオブジェクトは共有参照がなくなると破棄されます。

弱いポインタは目的の実行を支援します。クラスに弱いポインタが存在する場合、それはオブジェクトにポインタをキャッシュするのみで寿命をコントロールするわけではありません。

宣言と初期化

弱いポインタは常にシェアード ポインタや参照、または別の弱いポインタから作成されます。

// Allocate a new tree node.
TSharedRef<FTreeNode> NodeOwner( new FTreeNode() );

// Create a weak pointer to the new tree node.
TWeakPtr<FTreenode> NodeObserver( NodeOwner );

弱いポインタはオブジェクトの破棄を防止しないことを覚えておいてください。NodeObserver がまだスコープ内の時に NodeOwner がリセットされると、オブジェクトは削除されます。

// Destroy the node.
NodeOwner.Reset();

弱いポインタはシェアード ポインタと同様に、安全にコピーすることができます。

TWeakPtr<FTreeNode>  NodeObserverB = NodeObserver;

使用後は弱いポインタをリセット (または再代入) することができます。

NodeObserver = null;

逆参照とアクセス

弱いポインタのオブジェクトへのアクセスは、まず Pin() メソッドを呼び出してで弱いポインタをシェアード ポインタへ昇格させます。

// Get access to the node through the weak pointer.
TSharedPtr<TFreeNode> LockedObserver( NodeObserver.Pin() );

// Check that the shared reference was successfully created from the weak reference.
If( LockedObserver.IsValid() )
{
    // Object still exists, so it can be accessed.
    LockedObserver->ListChildren();
}

Pin() は高速です。Pin と呼ばれるのは、弱いポインタが一時的にアクセスされている間オブジェクトの破棄を防ぐからです。

弱いポインタはオブジェクトが削除されると自動的に認識します。このようなケースは IsValid() メソッドを使用して安全に処理できます。

// Make sure the weak pointer's object still exists before accessing it.
if( NodeObserver.IsValid() )
{
    ...
}

弱いポインタで循環参照を解決する

循環参照を解決するために弱いポインタを使用します。

class FTreeNode
{
    /** Child nodes, owned by this node. */
    TArray< TSharedPtr<FTreeNode> > Children;

    /** Weak pointer back to this node's parent. */
    TWeakPtr<FTreeNode> Parent;
}

FTreeNode は 所有する 子ノードに対してシェアード ポインタを持ちます。つまり子ノードは FTreeNode によって破壊されます。親ノードに対して参照をキャッシュする弱いポインタも使用します。弱いポインタはオブジェクトの破棄を決して防止することはありません。シェアード ポインタ / 弱いポインタをこのように使うと権限のチェーンがより明確になります。

弱いポインタは、オブジェクトが削除されるとこれを認識します。このように、ツリーのどのノードに対しても安全にポインタをキャッシュすることができます。

変換

弱いポインタをシェアード ポインタへ変換するには Pin() メソッドを使用しなくてはいけません。明示的なコンストラクターはありません。

タグ
Select Skin
Light
Dark

新しい Unreal Engine 4 ドキュメントサイトへようこそ!

あなたの声を私たちに伝えるフィードバックシステムを含め、様々な新機能について開発をおこなっています。まだ広く使える状態にはなっていないので、準備ができるまでは、ドキュメントフィードバックフォーラムで、このページについて、もしくは遭遇した問題について教えていただけると助かります。

新しいシステムが稼働した際にお知らせします。

フィードバックを送信