In the book The C++ Standard Library at page 91 I have read this about shared_from_this():
The problem is that
shared_ptrstores 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