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 が、指定されたポインターの前に順序付けされている (またはそれよりも少ない) 場合は true を返します。 |
|
所有されたリソースを解放します。 |
|
2 つの weak_ptr オブジェクトを交換します。 |
|
指定された shared_ptr オブジェクトの数をカウントします。 |
演算子
所有されたリソースを置き換えます。 |
必要条件
ヘッダー: <memory>
名前空間: std