enable_shared_from_this - 空内部弱指针?

Pup*_*ppy 19 c++ boost smart-pointers shared-ptr c++11

我正在使用enable_shared_from_this<Base>然后继承Base.当尝试使用shared_from_this()in Derived的构造函数(而不是初始化列表)时,我得到一个异常.事实证明,内部弱指针为空并且根本不指向this.怎么会发生这种情况?我的其他用例完全正常.我甚至不知道从哪里开始.我低头看了源代码enable_shared_from_this,它看起来像指针永远是nullptr.

Jam*_*lis 37

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

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


j_r*_*ker 5

James McNellis的回答是正确的.

至于enable_shared_from_this模板本身的解释,正如您所观察到的那样似乎什么都不做,本页底部的注释7 解释了:

...模板 enable_shared_from_this包含一个 weak_ptr指向派生对象的对象.但是,有一个关于如何在weak_ptr没有相应shared_ptr对象时初始化该对象 的鸡和蛋问题.实现技巧是构造者 在构造拥有作为公共基类的资源 的对象时shared_ptr知道 enable_shared_from_this并设置 weak_ptr对象.shared_ptrenable_shared_from_this