【问题标题】: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() 选择一个指向 this 的 shared_ptr 并返回它的副本。
在构造函数中,没有shared_ptr指向this。