2010-12-20 54 views
16

我使用的是enable_shared_from_this<Base>,然后从Base继承。当试图在Derived的构造函数(不是初始化程序列表)中使用shared_from_this()时,出现异常。原来内部弱指针为空,并且根本不指向this。这怎么会发生?我的另一个用例就是完美的。我甚至不知道从哪里开始。我低头看着enable_shared_from_this的源代码,它看起来像那个指针总是为nullptr。enable_shared_from_this - 空内部弱指针?

+1

不是重复的:http://stackoverflow.com/questions/4428023/enable-shared-from-this-c0x-what-am-i-doing-wrong – 2010-12-20 23:07:55

回答

34

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

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

5

James McNellis's answer是对的。

对于enable_shared_from_this模板本身,正如你观察显得无能为力,注意7的在this page底部的解释说明:

...模板 enable_shared_from_this持有 weak_ptr对象指向 派生对象。有一个 鸡与鸡蛋问题,虽然,约 如何初始化weak_ptr对象 时,没有对应的对象 shared_ptr对象。实施 诀窍是,对于 shared_ptr建设者了解 enable_shared_from_this,和建设 一个shared_ptr对象拥有具有 enable_shared_from_this作为公共 基类 资源过程中设置的 weak_ptr对象。

1

概念,shared_from_this()挑选一个shared_ptr指向this并返回它的一个副本。

在构造函数中,没有指向thisshared_ptr