Share via


weak_ptr クラス

関連付けの弱いポインターをラップします。

template<class Ty> class weak_ptr {
public:
    typedef Ty element_type;

    weak_ptr();
    weak_ptr(const weak_ptr&);
    template<class Other>
        weak_ptr(const weak_ptr<Other>&);
    template<class Other>
        weak_ptr(const shared_ptr<Other>&);

    weak_ptr& operator=(const weak_ptr&);
    template<class Other>
        weak_ptr& operator=(const weak_ptr<Other>&);
    template<class Other>
        weak_ptr& operator=(shared_ptr<Other>&);

    void swap(weak_ptr&);
    void reset();

    long use_count() const;
    bool expired() const;
    shared_ptr<Ty> lock() const;
    };

パラメーター

  • Ty
    ウィーク ポインターによって制御される型。

解説

このテンプレート クラスは、1 つ以上の shared_ptr クラス オブジェクトによって管理されるリソースを指し示すオブジェクトを表します。 リソースを指し示す weak_ptr オブジェクトは、そのリソースの参照カウントに一切影響を与えません。 したがって、リソースを管理する最後の shared_ptr オブジェクトが破棄されると、仮にそのリソースを指し示す weak_ptr オブジェクトが存在していたとしても、そのリソースは解放されます。 これは、データ構造の循環参照を防ぐうえで重要な機構です。

weak_ptr オブジェクトは、リソースを所有する shared_ptr オブジェクトから構築された場合、リソースを指し示す weak_ptr オブジェクトから構築された場合、またはリソースが weak_ptr::operator= を使って割り当てられた場合に、そのリソースを指し示します。 weak_ptr オブジェクトから、そのオブジェクトが指し示すリソースに直接アクセスすることはできません。 そのリソースを使用する必要があるコードは、メンバー関数 weak_ptr::lock を呼び出すことによって作成された、そのリソースを所有する shared_ptr オブジェクトを介してそのリソースにアクセスします。 weak_ptr オブジェクトは、そのオブジェクトが指し示すリソースが解放されると、そのリソースを所有するすべての shared_ptr オブジェクトが破棄されるため、期限切れになります。 有効期限の切れた weak_ptr オブジェクトで lock を呼び出すと、空の shared_ptr オブジェクトが作成されます。

空の weak_ptr オブジェクトは、リソースを一切参照せず、コントロール ブロックも持ちません。 そのメンバー関数 lock からは、空の shared_ptr オブジェクトが返されます。

循環参照は、shared_ptr オブジェクトによって制御される複数のリソースで、相互に参照し合う shared_ptr オブジェクトが保持されているときに発生します。 たとえば、N0、N1、N2 という 3 つの要素から成るリンク リストを考えてみます。N0 ノードは、次のノード (N1) を所有する shared_ptr オブジェクトを保持します。N1 ノードは、次のノード (N2) を所有する shared_ptr オブジェクトを保持します。ここで、N2 ノードが、先頭ノード (N0) を所有する shared_ptr オブジェクトを保持しているとすると、ループが閉じた状態になって、このリンク リストは循環参照を形成していることになります。 この状況では、参照カウントがゼロになることはないため、循環参照内のノードは解放されません。 この循環参照を解消するためには、最後のノード N2 が、shared_ptr オブジェクトではなく、N0 を指し示す weak_ptr オブジェクトを保持する必要があります。 weak_ptr オブジェクトは N0 を所有しないため、N0 の参照カウントに影響しません。先頭ノードに対する最後の参照が破棄された時点で、リスト内のノードも破棄されます。

メンバー

コンストラクター

weak_ptr::weak_ptr

weak_ptr を構築します。

メソッド

weak_ptr::element_type

要素の型を指定します。

weak_ptr::expired

所有権の有効期限が切れているかどうかをテストします。

weak_ptr::lock

リソースの排他的所有権を取得します。

weak_ptr::owner_before

この weak_ptr が、指定されたポインターの前に順序付けされている (またはそれよりも少ない) 場合は true を返します。

weak_ptr::reset

所有されたリソースを解放します。

weak_ptr::swap

2 つの weak_ptr オブジェクトを交換します。

weak_ptr::use_count

指定された shared_ptr オブジェクトの数をカウントします。

演算子

weak_ptr::operator=

所有されたリソースを置き換えます。

必要条件

ヘッダー: <memory>

名前空間: std

参照

関連項目

shared_ptr クラス

その他の技術情報

<memory> メンバー