私が知っているクラスはです。は常にstd::shared_ptr
になります。しかし、shared_ptr
またはweak_ptr
を所有権や生涯保証を必要としない関数やメソッドに渡すと、不必要なオーバーヘッドが発生します。これを回避するために、関数への生ポインタを渡すことがよくあります。クラス自体はstd::enable_shared_from_this
から継承されます。したがって、関数がポインタの所有権を必要とする場合は、クラスのメソッドを使用してshared_ptr
を取得できます。shared_from_thisに相当するweak_ptrはありますか?
これはすべて美しく動作しています。しかし、実際に生ポインタからshared_ptr
を作成したくない場合がありますが、代わりに私が欲しいのはweak_ptr
です。
私はstd::shared_ptr
の通常の実装について理解しているので、参照カウンタとして使用される2つの原子変数があります。 1つはshared_ptr
、1つはweak_ptr
です。
私が持っているのは私のクラスへの生ポインタで、weak_ptr
が必要な場合は、まずshared_ptr
を作成して変換する必要があります。コピーshared_ptr
カウンタ をデクリメント、shared_ptr
がスコープの外に出ることを許可weak_ptr
カウンタ
weak_ptr
を構築shared_ptr
カウンタshared_ptr
を構築
- :そうすることで、参照カウンタは、次のように変更されることを意味します
これは「あなたが使用していないものを支払うことはない」という考え方に反しているようです。私のクラスが最初に
shared_ptr
を作成せずにweak_ptr
を提供する方法はありますか?
「enable_shared_from_this」よりも「shared_from_this」に相当するものが必要です。 'weak_from_this'のようなもの。 –
あなたは正しいです、私はタイトルを編集します。 C++のために 'weak_from_this'が提案されましたが、私は今使っているものを探しています。 – Fibbles
これは 'std :: make_shared()'を使ってクラスが作成されたことを意味します。それらは、生のポインタを渡すスコープよりもずっと前になります。生ポインタが渡されたスコープを越えて格納される必要がある場合、それは 'shared_ptr'に変換されます。 –
Fibbles