C++でshared_ptr
は問題を解決するようになり、複数のオブジェクトがオブジェクトの所有権を取得すると複数の削除が行われます。それは最後の削除だけを行うことによってそうする。
オブジェクトが所有権を必要としているが、削除を遅らせることを望まないとき、ポインタが弱いポインタをとり、問題を防ぐためにそのポインタを削除したときに、そのポインタが別の風味があります。
これを行う別の方法があります。最後の削除のみを行うのではなく、最初の削除のみを行い、オブジェクトの残りの部分に弱いポインタのように起こったことを通知する必要があります。
これは、接続のようなオブジェクトの場合に便利です。一方の端が解放すれば、他方の端がこれを知っている間に破棄する必要があります。
C++やBoostにこれがありますか?異なる種類の共有所有者
0
A
答えて
0
このパターンは、オブジェクトの作成と破棄にのみ使用される単一の共有、相互排除されたshared_ptr
と、アクセスに使用されるクライアント/エンドポイントごとにweak_ptr
でモデル化できます。
このようなスキームは過剰なロックを引き起こし、必要なセマンティクスを提供しない可能性があることに注意してください。使用中にlock
weak_ptr
が必要で、これはshared_ptr
内部ミューテックスに触れます。一方の側がマスターのshared_ptr
インスタンスを破壊すると、オブジェクトは読み取り操作が完了している間も存続します。
さらに従来の解決策は、チャネル自体を介してハングアップメッセージを送信することでした。
0
通知のいくつかの種類があります
- 同期
- オンデマンド非同期
- (本当に通知)
は、あなたが本当に欲しいものに応じて、実装は大きく異なる可能性があります。
(オンデマンド)、後者は、典型的なshared_ptr
/weak_ptr
二分法によってすでに提供されています:weak_ptr
を通じてオブジェクトにアクセスするとき、それは一方で削除されている場合、あなたは知っていますよ。
他の2つは、従来のshared_ptr
の上にオブザーバーパターンを使用して実装できますが、複雑さとパフォーマンスの結果があるため、使用する前にその必要性を確認します。
関連する問題
- 1. 種類は、「種類」タイプとのトラブルを有するタイプのラムダ
- 2. 異なる種類
- 3. 異なる種類
- 4. QActionの所有者
- 5. 所有者トレイアイコン(winapi)?
- 6. 3種類のアプリケーション間で共有されているが安全なメモリ(Windows)
- 7. ファイルの所有者アイコン
- 8. Djangoのオブジェクト所有者
- 9. Django - ファイルロギングの所有者
- 10. Winformsコンポーネントの親/所有者
- 11. が所有者クラス(JFrameの)
- 12. ファイル所有者とnsapplication、appdelegate
- 13. WooCommerce共有数量が異なる
- 14. Doctrine 2の異なる所有者オブジェクトへの多態的な関連
- 15. 自動変更searchd.production.pid所有者にスフィンクス再起動後の所有者
- 16. 共有場所にJavaオープンファイル
- 17. getWaitQueueLength throw IllegalArgumentException:所有者でない
- 18. Microsoft Band - レスポンスステータス:所有者ではない
- 19. PostgreSQLで異なる所有者を持つすべてのテーブルのリスト制約
- 20. NSStringの異なる種類のUTF8デコード
- 21. マップベースの場所を共有する
- 22. 異なるアクティビティタイプ間で共通の機能を共有する
- 23. ブレークの種類が異なるステートフルループ
- 24. Xcodeアプリケーションの種類が異なる
- 25. パケットの種類が異なる
- 26. wpf usercontrol異なる種類のコレクションプロパティ
- 27. CSS3トリックを共有する場所
- 28. Windowsの "Program Files"のファイル所有者
- 29. 2種類の異なる種類の一致に使用する戻り値
- 30. ValueInjecter異なる種類/プロパティ名
使用する前にNULLメモリアドレスを指しているかどうかをチェックする単純なポインタラッパーを実装できませんか?したがって、オブジェクトがポインタを破壊する、すなわちNULL位置を指す場合、他のすべてのオブジェクトはポインタが既に削除されていることを知る。 –
スマートなptrからラップされたptrまでは、シングルスレッドの場合のこの問題を解決しますが、スレッドセーフなソリューションはかなり複雑です... BTW:質問への答えはいいえです。 –
オブジェクトのデストラクタからシグナルを発行できます。 Boost.Signalsを参照してください。 – rmflow