shared_ptr、加入、デストラクタ
-
20-09-2019 - |
質問
私が使っているブshared_ptrポインタの中の私の願います。最後の参照オブジェクトは、shared_ptrオブジェクトを削除します。のオブジェクトの申請を採用イベントの中心に位置するこのアプリケーションのと同様にオブザーバー/契約者のパターンです。
オブジェクトにdestructorsのオブジェクト登録の解除そのもののリストから参加できます。リストの契約数はん list<weak_ptr<MyObject> >
.ういうこと:
Type::~Type()
{
Subscriptions::Instance()->Remove(shared_from_this());
}
私の問題は、shared_from_thisに呼び出すことはできませんでdestructorsで上記のコードは例外をスローします。
私の古い実装では、契約リストの一覧が表示され、ポインタをうまくいった。ものを使いたいweak_ptr参照の代わりにリスクを軽減させるための狂メモリによるマニュアルメモリ管理.
かなshared_ptrいオブジェクトを削除、単に自分のコードできる論理的に話を解除するには.
そのアイデアだす。
解決
- を破壊することができるの送契約インスタンスのように自動的に削除のポインタ.
- きも忘れては削除してから契約数のweak_ptrの見できるロックがとにかく、それを除去することができます。
- を割り当てることができるユニークなIDべてのオブジェクトを削除します、ユニークなIDのshared_ptr
- で渡すことができます(通常のポインタを取り除くの共通のひとつと"ID".
他のヒント
私の問題であること
shared_from_this
呼び出すことはできませんで destructorsで上記のコードは例外をスローします。
例外をスローします で終了しました, 定義によれば、デストラクタ.
なんでください。 "は終了しました"共通のポインター?を作成し、空の共通のポインタです。
または 期限切れに弱いポインター?
いることに気付いた場合は、"問題ないのではないか"という shared_from_this
投げという症状)は全てオーナー ている本質的にすでにリセットまたは破壊され その時点のポインタが終了し、相当の空のデフォルトの作成に弱いポインタ(*)なので、あなただけのスタッフは最終的なデフォルトの初期化に弱いポインタです。
も Subscriptions::Instance()->Remove(weak_OR_owning_pointer)
意味がないのいずれかの方は弱いまたは保有ポインタとしてできないなどの比較的弱いポインタを何でもできるだけみロックましい。
できるだけ取り除了しました弱いポインタ. 引数 Remove
どちらがいいでしょうか?
(*)のいずれかがやきものの深刻なダブルバグダブル所有のオブジェクトの破壊!