10

ヘルパーにはenable_shared_from_this、オブジェクトへの共有ポインターを作成するときに設定される弱いポインターが含まれています。これは、参照カウント(個別に、またはを使用してオブジェクトと一緒に割り当てられるmake_shared)とオブジェクトに余分なものがあることを意味weak_ptrします。

では、なぜ代わりに参照カウントが含まれていないのですか?ダムポインタから設定する場合shared_ptrは、型を完全に定義する必要があるため、shared_ptrコンストラクタまたは代入演算子は、型が派生していることを検出しenable_shared_from_thisて正しいカウンタを使用でき、形式は同じままであるため、コピーは関係ありません。実際、shared_ptr埋め込みを設定するには、すでにそれを検出する必要がありますweak_ptr

4

3 に答える 3

7

最初に頭に浮かぶのは、そのアプローチがまったく実行可能かどうかということです。答えは、実行可能ではないということです。

struct X : enable_shared_from_this {};
std::shared_ptr<X> p( new X );
std::weak_ptr<X> w( p );
p.reset();                      // this deletes the object
if ( w.use_count() ) {          // this needs access to the count object
                                //    but it is gone! Undefined Behavior

カウントがオブジェクトに保存されている場合、weak_ptrオブジェクトよりも長持ちすることはできません。これは契約違反です。の全体的な考え方はweak_ptr、オブジェクトよりも長持ちする可能性があるということです(最後shared_ptrがスコープ外になると、オブジェクトが存在する場合でもオブジェクトは削除されますweak_ptr

于 2011-07-26T10:03:04.087 に答える
1

オブジェクトにカウントを埋め込むことで利点を得るには、の2番目のポインタを削除する必要がありますshared_ptr。これにより、レイアウトが変更され、デストラクタオブジェクトの作成に問題が発生します。レイアウトを変更する場合、この変更は、shared_ptrが使用されるすべての場所に表示される必要があります。shared_ptrつまり、不完全な型を指すインスタンスを作成することはできませんでした。

于 2011-07-26T09:52:02.880 に答える
1

関心の分離:make_sharedカウントを埋め込むためにenable_shared_from_thisshared_from_this

この2つを混在させる必要がある理由はありません。ライブラリは、クライアントコードが要件に対して何を持っているかを想定できません。2つを分離することにより、クライアントコードは最適なものを選択できます。

さらに、Boost(どこshared_ptrから来たのか)も提案しintrusive_ptrます。

(あなたの提案はカスタム削除を許可していないようだと考えてください。に変更することで修正できますが、この時点で再発明に近づいています。)enable_shared_from_thistemplate<typename T, typename Deleter = default_deleter<T>> class enable_shared_from_this;intrusive_ptr

于 2011-07-26T08:05:28.887 に答える