0

私は ACE フレームワークを使用していますが、それを参照せずに問題を説明しようと思います。

イベント ハンドラー (ACE_Event_Handler から派生したクラス) があります。イベント ハンドラーへの参照は、shared_ptr のマップ内の一部のマネージャー クラスによって保持されます。

ある時点で私はしたい:

  1. マネージャー マップからイベント ハンドラーを削除する
  2. イベント ハンドラのいくつかのメソッドは、イベント ハンドラへの行ポインタを保持する 3 番目のクラスによって呼び出される必要があります (ACE に精通している場合は、ACE Reactor によって呼び出される handle_close() です)。

問題は、順序 (1) と (2) が約束されていないことです。(1) が (2) の前に呼び出された場合、(2) はダングリング イベント ハンドラーで動作します。

そのため、(2) でデクリメントされるイベント ハンドラーへの参照を追加することを考えました。

それはどのように行うことができますか?イベント ハンドラへの参照をイベント ハンドラ自体から維持できますか (おそらく enable_shared_from_this を使用)。

ありがとう

4

1 に答える 1

1

メンバー変数に自分自身への共有ポインターを保持すると、shared_ptr の目的が無効になります。これは、何らかの方法でオブジェクトに不要になったことを通知する必要があるためです (これが「obj の削除」であり、スマート ポインターの使用を避けようとしています)。 .
解決策の 1 つとして、可能であれば、3 番目のクラスの raw ポインターを shared_ptr (または weak_ptr) に置き換えます。他のソリューションは、アプリケーションの設計に大きく依存します。たとえば、マネージャーからポインターを削除するために何らかの方法で強制的に注文することができます...
このドキュメントを調査してみてください http://www.boost.org/doc/libs/1_43_0/libs/ smart_ptr/sp_techniques.html、おそらくあなたにとって役立つものが見つかるでしょう。

于 2010-10-06T10:09:00.497 に答える