2

アプリケーション全体で 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 か所もありません。

この状況で何をすべきかについてのアイデアはありますか?

4

2 に答える 2

1
  1. Subscription インスタンスを介してオブジェクトを破棄すると、ポインタが自動的に削除されます。
  2. サブスクリプションからそれらを削除することを忘れることができます.weak_ptrはロックできません.その後、それらを削除できます.
  3. すべてのオブジェクトに一意の ID を割り当ててから、shared_ptr ではなく一意の ID を介して削除できます
  4. 共有ポインターの代わりに通常のポインターを Remove に渡すことができます。これは「ID」として機能します。
于 2009-12-18T20:36:55.023 に答える