1

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

显而易见的解决方案是立即进行某种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 回答