我正在使用enable_shared_from_this<Base>
,然后继承自Base
。当试图在shared_from_this()
的构造函数(不是初始化列表)中使用Derived
时,我得到一个异常。事实证明,内部弱指针为空,并且根本不指向this
。怎么会发生这种情况?我的其他用例完全正常。我甚至不知道从哪里开始。我低头看了enable_shared_from_this
的源代码,它看起来像指针一直是nullptr。
答案 0 :(得分:37)
您无法在对象的构造函数中调用shared_from_this()
。 shared_from_this()
要求该对象至少拥有一个shared_ptr
。在构造之前,对象不能由shared_ptr
拥有。
我猜想当shared_ptr
第一次获得对象的所有权时,会设置内部弱指针。在此之前,弱指针可以引用没有引用计数结构。
答案 1 :(得分:5)
至于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
物体 拥有a的shared_ptr
对象 资源有enable_shared_from_this
作为公众 基类。
答案 2 :(得分:1)
从概念上讲,shared_from_this()
选择指向shared_ptr
的{{1}}并返回其副本。
在构造函数中,没有this
指向shared_ptr
。