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

How does shared_from_this in std::bind work where object does not exist?

本文关键字:this from 工作 何工作 中的 不存在 对象 情况下 bind std shared      更新时间:2023-10-16

该代码安全吗?

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操作可能需要很长时间。

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

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

这种对会发生什么的描述是否正确?

不,你说得不对。

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

因此,当您到达 (2( 时,对该对象的两个引用中只有一个消失了,并且它仍然处于活动状态