我正在使用boost共享指针,这些指针实际上是在整个应用程序中共享的。存在这样的条件,其中这样的共享指针变得无效。例如,指向网络资源的共享指针,由于网络不可用而可能变为无效。在这种情况下,共享指针变为无效,我希望所有对象停止使用它。如何向指针无效的所有对象发送消息。如果它是一个普通的指针,我可以将它设置为null,所有客户端代码应该在使用之前检查空指针。但是,如果共享指针保持引用计数,我该如何实现类似的功能呢?
答案 0 :(得分:3)
你可以使用弱指针。也就是说,处理网络事件的代码具有shared_ptr<Res>
,而其他人都有weak_ptr<Res>
。现在,
shared_ptr
重置为NULL
; lock()
中调用weak_ptr
并在使用前测试返回的shared_ptr
是否有效。答案 1 :(得分:2)
如果是普通指针,我可以将其设置为null,并且所有客户端代码都应该在使用之前检查空指针。
我对此表示怀疑。然后,您将拥有指向无效对象的原始指针的副本。您认为这可以解决问题,但它不会。它放大了它。
事实是共享指针本身不会变为无效,它包含的对象就是无效。因此,从逻辑上讲,它是否仍然可以安全使用它应该包含在对象中,而不是共享指针。
指向网络资源的共享指针,由于网络不可用而可能变为无效。
当您尝试调用尝试使用网络的方法时,只需抛出异常......
答案 2 :(得分:1)
您需要存储更多信息。您可以将资源与bool放在一个元组中,或者可以使用boost::optional
,并在想要使其无效时将其设置为none
。
答案 3 :(得分:1)
你几乎肯定不应该使用共享指针,因为 它的语义与你需要的不一致。共享指针 实现了一种穷人的垃圾收集,其中的对象 当没有更多指针时,它就不复存在了;你需要的 相反,当存在时,指向对象的指针不再存在 没有更多的对象。 (反过来垃圾收集,可以这么说。)
我过去曾使用ManagedPtr
;指针自身注册
该对象必须派生自ManagingObj
类来设置
析构函数中指向null的指针。这有时会起作用,但它仍然存在
不会从列表等中删除其他对象所在的条目
保持它。而在实践中,其他对象了解你的
网络资源对象可能希望在它采取特定操作时
消失。最后,您几乎总是需要使用观察者
pattern:获取指向对象寄存器的指针的任何对象
在它消亡的情况下通知它。
答案 4 :(得分:1)
我倾向于遵循标准流使用的模式:拥有一个代表资源的对象,当它检测到(或被告知)网络不再存在时,可以进入错误状态和/或抛出异常可用。如果您无法更改现有资源类,则此新对象可以保存现有资源对象(当前所有用户都有共享指针),并且用户可以共享新对象。
除非您需要此资源的所有用户在其变得不可用时立即作出响应,否则尝试将消息传播给所有用户似乎没有任何意义。如果您只是希望他们停止使用它,他们可以在下次尝试使用它时执行此操作,并发现它不再起作用。如果他们确实需要一条消息,那么写一些东西来保存它们的所有列表,并在它们感兴趣的事件发生时调用它们的一些函数。这被称为观察者模式或“听众”,并配有那些搜索术语,您可以找到实现和替代。
理想情况下,用户应该能够在使用资源时或之后立即检查错误状态。在使用之前进行测试通常容易出错,因为它会创建一个窗口,在该窗口中,网络可能在测试之后但在使用之前 不可用。一旦您的代码必须正确处理该案例,您也可以将其作为 only 案例,而不必提前检查。