enable_shared_from_this - 空内部弱指针?

时间:2010-12-20 22:52:26

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

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

3 个答案:

答案 0 :(得分:37)

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

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

答案 1 :(得分:5)

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物体   拥有a的shared_ptr对象   资源有   enable_shared_from_this作为公众   基类。

答案 2 :(得分:1)

从概念上讲,shared_from_this()选择指向shared_ptr的{​​{1}}并返回其副本。

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