複数の拠点からの私のクラスの継承、そのうちの一つですstd::enable_shared_from_this
。それは最初の塩基でなければなりませんか?
次のコード例を仮定します。
struct A { ~A(); };
struct B { ~B(); };
struct C : A, B, std::enable_shared_from_this<C> {};
std::make_shared<C>();
とき~A()
と~B()
実行、私はストレージことを確認することができますC
住んでいたが、依然として存在しているのですか?
とき
~A()
と~B()
実行、私はストレージことを確認することができますC
住んでいたが、依然として存在しているのですか?
もちろん!試行は独自のメモリー(それが存在するメモリ)を解放することを基本クラスを使用するのは難しいだろう。私はそれも正式に法的だか分かりません。
実装はそれを行うません:ときshared_ptr<T>
破壊またはリセットされ、共有の所有権のための参照カウント(RC)はT
(アトミック)デクリメントされ、それはデクリメントで0に達した場合、その後の破壊/削除がT
開始されます。
続いて、カウントが(アトミック)デクリメントさ弱所有者-または-Tは、存在してT
は存在しません:我々は最後のエンティティが制御ブロックに興味を持って立っているかどうかを知る必要があります。減少は、非ゼロの結果を得た場合、それはいくつかの手段weak_ptr
共有制御ブロックの所有権(1株、または100%であり得る)ことが存在し、それらは今や解放する責任があります。
いずれかの方法で、原子減少はいくつかの点で、最後の共同所有者のために、ゼロ値で終了します。
ここで最後は明らかに何のスレッド、無非決定論、および存在しないweak_ptr<T>
の破壊時に破壊されたがC
。(あなたの質問で書き込まれていない仮定は、他のことをされてweak_ptr<T>
保持されませんでした。)
破壊は常にその中で起こる正確な順序。何のように、制御ブロックは、破壊のために使用されていないshared_ptr<T>
コールに(潜在的に異なる)最も派生クラスのどの(潜在的に非仮想)デストラクタ(一般的に)知っています。(制御ブロックも知っていないため、共有カウント到達ゼロに割り当て解除メモリにmake_shared
。)
実装間の唯一の実用的な変動は、細かいメモリフェンスの詳細と一般的なケースでは、いくつかのアトミック操作を避けることについてのようです。