销毁其他人引用的对象

时间:2012-07-23 21:31:22

标签: c++

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

显而易见的解决方案是立即进行某种onDisconnected回调和delete,允许应用程序在尝试继续使用时崩溃,或将其作为shared_ptr传递然后让对象逗留直到应用程序清理它。这些方法对我来说都不是特别好。前者只是觉得不安全,后者混淆了谁拥有连接的概念,并且如果应用程序忽略了回调,则可能发生泄漏。

我是否缺少一些惯用的解决方案,或者只是更好的方法?

2 个答案:

答案 0 :(得分:5)

对我来说似乎没有人是对象的明确拥有者,所以我选择使用shared_ptr。 IMO正是你需要它的那种情况。

答案 1 :(得分:1)

目前还不清楚您是在编写库组件还是应用程序(或两者),但如果您不拥有该对象,那么您无需决定何时销毁它。

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