What is the usefulness of `enable_shared_from_this`?

boost, boost-asio, c++, tr1

Solution

It enables you to get a valid `shared_ptr` instance to `this`, when all you have is `this`. Without it, you would have no way of getting a `shared_ptr` to `this`, unless you already had one as a member. This example from the boost documentation for enable_shared_from_this:

class Y: public enable_shared_from_this<Y>
{
public:

    shared_ptr<Y> f()
    {
        return shared_from_this();
    }
}

int main()
{
    shared_ptr<Y> p(new Y);
    shared_ptr<Y> q = p->f();
    assert(p == q);
    assert(!(p < q || q < p)); // p and q must share ownership
}

The method `f()` returns a valid `shared_ptr`, even though it had no member instance. Note that you cannot simply do this:

class Y: public enable_shared_from_this<Y>
{
public:

    shared_ptr<Y> f()
    {
        return shared_ptr<Y>(this);
    }
}

The shared pointer that this returned will have a different reference count from the "proper" one, and one of them will end up losing and holding a dangling reference when the object is deleted.

`enable_shared_from_this` has become part of C++ 11 standard. You can also get it from there as well as from boost.

Problem

I ran across `enable_shared_from_this` while reading the Boost.Asio examples and after reading the documentation I am still lost for how this should correctly be used. Can someone please give me an example and explanation of when using this class makes sense.

Original source

Related problems