【问题标题】:enable_shared_from_this - empty internal weak pointer?enable_shared_from_this - 空的内部弱指针?
【发布时间】:2011-05-28 13:03:36
【问题描述】:

我正在使用enable_shared_from_this<Base>,然后从Base 继承。当试图在Derived 的构造函数(不是初始化列表)中使用shared_from_this() 时,我得到一个异常。结果发现内部弱指针为空,根本不指向this。这怎么可能发生?我的另一个用例完全可以正常工作。我什至不知道从哪里开始。我低头看了enable_shared_from_this的源代码,在我看来那个指针永远都是nullptr。

【问题讨论】:

标签: c++ boost c++11 shared-ptr smart-pointers


【解决方案1】:

您不能在对象的构造函数中调用shared_from_this()shared_from_this() 要求对象由至少一个 shared_ptr 拥有。在构造对象之前,shared_ptr 不能拥有一个对象。

我猜想当shared_ptr 第一次获得对象的所有权时设置了内部弱指针。在此之前,没有弱指针可以引用的引用计数结构体。

【讨论】:

    【解决方案2】:

    James McNellis's answer 是对的。

    至于enable_shared_from_this 模板本身的解释,正如您所观察到的,它似乎什么也没做,this page 底部的注释 7 解释:

    ...模板 enable_shared_from_this 持有一个 weak_ptr 指向的对象 派生对象。有个 然而,鸡和蛋的问题,关于 如何初始化 weak_ptr 对象 当没有对应的 shared_ptr 对象。实施 诀窍是构造函数 shared_ptr了解一下 enable_shared_from_this,并设置 weak_ptr 对象在构建期间 拥有一个 shared_ptr 对象 有的资源 enable_shared_from_this 作为公众 基类。

    【讨论】:

      【解决方案3】:

      从概念上讲,shared_from_this() 选择一个指向 thisshared_ptr 并返回它的副本。

      在构造函数中,没有shared_ptr指向this

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-13
        • 1970-01-01
        • 2013-03-07
        • 2012-01-11
        • 2014-08-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多