2012-07-23 71 views
1

假设我的应用程序使用的库对象Server具有一个回调onConnected,它在与客户端建立新连接时传递对Connection对象的引用; Server保留Connection的所有权。我想在关闭时(本地或远程)销毁Connection,但我不确定如何最好地处理通知正在使用连接的应用程序。销毁其他人参考的对象

显而易见的解决办法是立即有某种onDisconnected回调,要么delete它允许应用程序,如果它试图继续使用它,或者把它作为shared_ptr,只是让对象徘徊,直到应用程序清除它崩溃向上。这两种方法对我都不是特别好。前者只是感觉不安全,后者混淆谁拥有连接的概念,并且如果应用程序忽略回调则可能泄漏。

有没有一些这种我失踪的习惯解决方案,或者只是一个更好的方法呢?

回答

1

目前还不清楚你是在编写库组件还是应用程序(或两者),但是如果你不拥有这个对象,那么它不取决于你什么时候去销毁它。

但是看看连接如何处理通常在OS网络库中工作;当连接关闭时,应用程序的连接句柄不会突然失效。应用程序是连接的句柄的所有者,并负责正确关闭它。但最终用于处理连接的实际数据结构由内核拥有,并且可以在连接不再实际打开时丢弃。然后,当尝试使用关闭连接时,应用程序将获得定义良好的错误。

+0

我正在开发两者。它已经在生产中,我只是想着我可以改进它的方式。您对操作系统的操作方式做了一个很好的说明。它仍然是一种共享所有权,但可能比仅使用shared_ptr更好一些。我想这是非常不可避免的。 – spencercw 2012-07-24 08:43:56

5

对我来说,似乎没有人是对象的明确所有者,所以我会去使用shared_ptr。海事组织正是你需要它的那种情况。