In the book The C++ Standard Library at page 91 I have read this about shared_from_this()
:
The problem is that
shared_ptr
stores itself in a private member ofPerson
’s base class,enable_shared_from_this<>
, at the end of the construction of the Person.
The relevant code snippet from the book is:
class Person : public std::enable_shared_from_this<Person> { ... };
I don't understand two things here:
shared_ptr
which stores itself?Person
? I think construction of Person
ends up with the last statement of its constructor which written by me.I understand that there is weak_ptr
which hasn't been initialized yet.
EDIT: Thanks to Angew! shared_from_this
will work only after first shared_ptr
to Person
was created. This shared_ptr
will check if Person
class inherited from enable_shared_from_this
, and if yes then initialize its internal weak_ptr
.
By deriving your class from the class template enable_shared_from_this , you inherit a method shared_from_this that returns a shared_ptr instance to this . Note(2) you cannot call enable_shared_from_this inside the constructor.
shared_from_this. returns a shared_ptr which shares ownership of *this. (public member function)
The reason is simple: in object X
, enable_shared_from_this
works by initialising a hidden weak_ptr
with a copy of the first shared_ptr
which points to object X
. However, for a shared_ptr
to be able to point to X
, X
must already exist (it must be already constructed). Therefore, while the constructor of X
is running, there is yet no shared_ptr
which enable_shared_from_this
could use.
Take this piece of code:
std::shared_ptr<Person> p(new Person());
Before the constructor of p
(of the shared_ptr
) is even called, its argument must be evaluated. That argument is the expression new Person()
. Therefore, the constructor of Person
runs before the constructor of p
has even begun—before there is any shared_ptr
object to which enable_shared_from_this
could bind.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With