2012-04-28 13 views
0

C++でshared_ptrは問題を解決するようになり、複数のオブジェクトがオブジェクトの所有権を取得すると複数の削除が行われます。それは最後の削除だけを行うことによってそうする。
オブジェクトが所有権を必要としているが、削除を遅らせることを望まないとき、ポインタが弱いポインタをとり、問題を防ぐためにそのポインタを削除したときに、そのポインタが別の風味があります。
これを行う別の方法があります。最後の削除のみを行うのではなく、最初の削除のみを行い、オブジェクトの残りの部分に弱いポインタのように起こったことを通知する必要があります。
これは、接続のようなオブジェクトの場合に便利です。一方の端が解放すれば、他方の端がこれを知っている間に破棄する必要があります。
C++やBoostにこれがありますか?異なる種類の共有所有者

+0

使用する前にNULLメモリアドレスを指しているかどうかをチェックする単純なポインタラッパーを実装できませんか?したがって、オブジェクトがポインタを破壊する、すなわちNULL位置を指す場合、他のすべてのオブジェクトはポインタが既に削除されていることを知る。 –

+0

スマートなptrからラップされたptrまでは、シングルスレッドの場合のこの問題を解決しますが、スレッドセーフなソリューションはかなり複雑です... BTW:質問への答えはいいえです。 –

+0

オブジェクトのデストラクタからシグナルを発行できます。 Boost.Signalsを参照してください。 – rmflow

答えて

0

このパターンは、オブジェクトの作成と破棄にのみ使用される単一の共有、相互排除されたshared_ptrと、アクセスに使用されるクライアント/エンドポイントごとにweak_ptrでモデル化できます。

このようなスキームは過剰なロックを引き起こし、必要なセマンティクスを提供しない可能性があることに注意してください。使用中にlockweak_ptrが必要で、これはshared_ptr内部ミューテックスに触れます。一方の側がマスターのshared_ptrインスタンスを破壊すると、オブジェクトは読み取り操作が完了している間も存続します。

さらに従来の解決策は、チャネル自体を介してハングアップメッセージを送信することでした。

0

通知のいくつかの種類があります

  • 同期
  • オンデマンド非同期
  • (本当に通知)

は、あなたが本当に欲しいものに応じて、実装は大きく異なる可能性があります。

(オンデマンド)、後者は、典型的なshared_ptr/weak_ptr二分法によってすでに提供されています:weak_ptrを通じてオブジェクトにアクセスするとき、それは一方で削除されている場合、あなたは知っていますよ。

他の2つは、従来のshared_ptrの上にオブザーバーパターンを使用して実装できますが、複雑さとパフォーマンスの結果があるため、使用する前にその必要性を確認します。

関連する問題