开发者

enable_shared_from_this - empty internal weak pointer?

开发者 https://www.devze.com 2023-02-01 01:05 出处:网络
I\'m using enable_shared_from_this<Base> and then inherit from Base. When trying to use 开发者_开发技巧shared_from_this() in Derived\'s constructor (not initializer list), I get an exception. Tu

I'm using enable_shared_from_this<Base> and then inherit from Base. When trying to use 开发者_开发技巧shared_from_this() in Derived's constructor (not initializer list), I get an exception. Turns out that the internal weak pointer is null and doesn't point to this at all. How can this happen? My other use case of exactly this works perfectly fine. I don't even know where to start. I looked down at the source code of enable_shared_from_this, and it looks to me like that pointer would always be nullptr.


You cannot call shared_from_this() in the object's constructor. shared_from_this() requires that the object is owned by at least one shared_ptr. An object cannot be owned by a shared_ptr before it is constructed.

I would guess that the internal weak pointer is set when a shared_ptr takes ownership of the object for the first time. Before that point, there is no reference count struct that the weak pointer can reference.


James McNellis's answer is right.

As for the explanation of the enable_shared_from_this template itself, which as you observe appears to do nothing, note 7 at the bottom of this page explains:

...the template enable_shared_from_this holds a weak_ptr object that points to the derived object. There's a chicken-and-egg problem, though, about how to initialize that weak_ptr object when there is no corresponding shared_ptr object. The implementation trick is that the constructors for shared_ptr know about enable_shared_from_this, and set the weak_ptr object during construction of a shared_ptr object that owns a resource that has enable_shared_from_this as a public base class.


Conceptually, shared_from_this() picks a shared_ptr pointing to this and returns a copy of it.

In the constructor, there is no shared_ptr pointing to this.

0

精彩评论

暂无评论...
验证码 换一张
取 消