假设我的应用程序正在使用具有回调Server
的库对象onConnected
,它在与客户端建立新连接时传递对Connection
对象的引用; Server
保留Connection
的所有权。我希望在关闭时(无论是本地还是远程)销毁Connection
,但我不确定如何最好地处理通知正在使用连接的应用程序。
显而易见的解决方案是立即进行某种onDisconnected
回调和delete
,允许应用程序在尝试继续使用时崩溃,或将其作为shared_ptr
传递然后让对象逗留直到应用程序清理它。这些方法对我来说都不是特别好。前者只是觉得不安全,后者混淆了谁拥有连接的概念,并且如果应用程序忽略了回调,则可能发生泄漏。
我是否缺少一些惯用的解决方案,或者只是更好的方法?
答案 0 :(得分:5)
对我来说似乎没有人是对象的明确拥有者,所以我选择使用shared_ptr
。 IMO正是你需要它的那种情况。
答案 1 :(得分:1)
目前还不清楚您是在编写库组件还是应用程序(或两者),但如果您不拥有该对象,那么您无需决定何时销毁它。
但是看看连接句柄通常如何在OS网络库中工作;连接关闭时,应用程序的连接句柄不会突然变为无效。应用程序是其连接句柄的所有者,并负责正确关闭它。但最终用于处理连接的实际数据结构由内核拥有,并且可以在连接不再实际打开时被丢弃。然后,在尝试使用关闭连接时,应用程序将获得明确定义的错误。