Search code examples
c++boostboost-asiotr1

What is the usefulness of `enable_shared_from_this`?


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.


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.