アプリケーション全体で Boost/shared_ptr ポインターを使用しています。オブジェクトへの最後の参照が解放されると、shared_ptr がオブジェクトを削除します。アプリケーション内のオブジェクトは、オブザーバー/サブスクライバー パターンと同様に、アプリケーションの中央の場所でイベントをサブスクライブします。
オブジェクト デストラクタでは、オブジェクトはサブスクリプションのリストから自身をサブスクライブ解除します。サブスクリプションのリストは基本的に単なるlist<weak_ptr<MyObject> >
. 私がやりたいことは、これに似たものです:
Type::~Type()
{
Subscriptions::Instance()->Remove(shared_from_this());
}
ここでの問題は、デストラクタで shared_from_this を呼び出すことができないため、上記のコードで例外がスローされることです。
私の古い実装では、サブスクリプション リストは単なるポインターのリストでしたが、それは機能していました。しかし、代わりにweak_ptr参照を使用して、手動のメモリ管理によってメモリを台無しにするリスクを減らしたいと考えています。
オブジェクトの削除は shared_ptr に依存しているため、Unsubscribe を論理的に呼び出すことができる場所がコード内に 1 か所もありません。
この状況で何をすべきかについてのアイデアはありますか?