【问题标题】:shared_ptr puzzleshared_ptr 谜题
【发布时间】:2010-10-06 08:09:47
【问题描述】:

我正在使用 ACE 框架,但我会尝试在不参考它的情况下描述我的问题。

我有一个事件处理程序(从 ACE_Event_Handler 派生的类)。 对事件处理程序的引用由 shared_ptr 映射中的某个管理器类持有。

在某个时间点我想:

  1. 从管理器映射中删除事件处理程序
  2. 事件处理程序的某些方法应由持有指向事件处理程序的行指针的第 3 个类调用(对于熟悉 ACE 的人,它是由 ACE Reactor 调用的 handle_close())

问题是订单(1)和(2)没有被承诺。如果 (1) 在 (2) 之前调用,则 (2) 将作用于悬空事件处理程序。

所以我考虑添加一些对事件处理程序的额外引用,这些引用将在 (2) 中递减。

如何做到这一点? 是否可以从事件处理程序本身内部维护对事件处理程序的引用(可能使用 enable_shared_from_this)?

谢谢

【问题讨论】:

    标签: boost shared-ptr ace


    【解决方案1】:

    在成员变量中持有指向自身的共享指针会破坏 shared_ptr 的目的,因为您需要以某种方式告知对象它不再需要(这就是“删除 obj”的目的,我们试图避免使用智能指针)。
    作为解决方案之一:如果可能的话,用 shared_ptr(或weak_ptr)替换第 3 类中的原始指针。 其他解决方案在很大程度上取决于您的应用程序的设计,例如,您可以以某种方式强制命令从管理器中删除指针...
    试着研究一下这个文档http://www.boost.org/doc/libs/1_43_0/libs/smart_ptr/sp_techniques.html,也许你会发现对你有用的东西。

    【讨论】:

    • +1 感谢您的链接。我完全同意你的建议。但是它们不适用于我的情况。
    猜你喜欢
    • 2015-04-29
    • 1970-01-01
    • 2013-03-18
    • 2015-01-13
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多