std :: bind中的shared_from_this如何在对象不存在的情况下工作?

时间:2016-02-17 22:16:46

标签: c++ c++11 boost-asio bind shared-ptr

该代码安全吗?

class C : public std::enable_shared_from_this<C> {
    void start() {
             boost::asio::async_write(socket_, boost::asio::buffer(message_), 
             std::bind(&tcp_connection::handle_write, shared_from_this(),
             _1, _2));
    };
    // ...
};

class D {
    void start()
    {
         std::shared_ptr<C> cptr = std::make_shared<C>(); // (1)
         cptr->start();
    } // (2)
};

如果消息很长,async_write操作可能需要很长时间。

在点(1)处只有一个shared_ptr指向C对象。 start()被调用,start()结束,在(2)变量cptr超出范围并被销毁。

async_write完成写操作时,调用回调;这会导致崩溃,因为shared_from_this()会尝试向不存在的对象生成shared_ptr

对这种情况的描述是否正确?

1 个答案:

答案 0 :(得分:7)

不,你不对。

shared_from_this()的调用发生在start返回之前。结果shared_ptr的副本由bind的结果保存。

所以当你到达(2)时,对象的两个引用中只有一个已经消失,并且它仍然存在