1

私のアプリケーションが、クライアントとの新しい接続が確立されたときにオブジェクトへの参照を渡すServerコールバックを持つライブラリオブジェクトを使用していると仮定します。の所有権を保持します。(ローカルまたはリモートで)閉じられたときに破棄したいのですが、接続を使用しているアプリケーションへの通知にどのように対処するのが最善かわかりません。onConnectedConnectionServerConnectionConnection

明らかな解決策は、ある種のonDisconnectedコールバックをdeleteすぐに実行して、アプリケーションが使用を継続しようとするとアプリケーションがクラッシュするようにするか、それをそのまま渡してshared_ptr、アプリケーションがクリーンアップするまでオブジェクトをそのままにしておくことです。これらのアプローチはどちらも私にとって特に良いとは感じません。前者は安全でないと感じ、後者は接続の所有者の概念を混乱させ、アプリケーションがコールバックを無視した場合にリークを可能にします。

私が見逃しているこれに対する慣用的な解決策はありますか、それともそれを行うためのより良い方法はありますか?

4

2 に答える 2

5

私には、オブジェクトの明確な所有者は誰もいないように思われるので、を使用しshared_ptrます。IMOそれはまさにあなたがそれを必要とするような状況です。

于 2012-07-23T21:34:04.187 に答える
1

ライブラリコンポーネントとアプリケーション(またはその両方)のどちらを作成しているかは不明ですが、オブジェクトを所有していない場合は、いつ破棄するかを決めるのはあなた次第です。

ただし、OSネットワークライブラリで接続ハンドルが通常どのように機能するかを見てください。接続が閉じたときに、アプリケーションの接続ハンドルが突然無効になることはありません。アプリケーションは接続のハンドルの所有者であり、正しく閉じる責任があります。ただし、最終的には、接続を処理するための実際のデータ構造はカーネルによって所有され、接続が実際に開かれなくなったときに破棄できます。次に、シャットダウン接続を使用しようとすると、アプリケーションは明確に定義されたエラーを受け取ります。

于 2012-07-23T22:24:19.500 に答える