次の方法で共有


weak_ptr クラス

更新 : 2007 年 11 月

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

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 が、smart_ptr オブジェクトではなく、N0 を指し示す weak_ptr オブジェクトを保持する必要があります。weak_ptr オブジェクトは N0 を所有しないため、N0 の参照カウントに影響しません。先頭ノードに対する最後の参照が破棄された時点で、リスト内のノードも破棄されます。

必要条件

ヘッダー : <memory>

名前空間 : std::tr1

参照

参照

<memory> (TR1)

shared_ptr クラス