shared_from__this和this的用例



在此源文件中有两个类: tcp_connectiontcp_server。我认为我认为相关的代码位,但您可能想参考完整的源代码以获取更多信息。

class tcp_connection : public boost::enable_shared_from_this<tcp_connection>
{
public:
  typedef boost::shared_ptr<tcp_connection> pointer;
  void start()
  {
    message_ = make_daytime_string();
    boost::asio::async_write(socket_, boost::asio::buffer(message_),
        boost::bind(&tcp_connection::handle_write, shared_from_this()));
  }
};
class tcp_server
{    
private:
  void start_accept()
  {
    tcp_connection::pointer new_connection =
      tcp_connection::create(acceptor_.get_io_service());
    acceptor_.async_accept(new_connection->socket(),
        boost::bind(&tcp_server::handle_accept, this, new_connection,
          boost::asio::placeholders::error));
  }
};

我的问题很简单:在async_write功能中,我们将shared_from_this用作CC_3参数,然后将this用作 async_accept函数中的bind参数?

共享指针控制动态分配对象的寿命。每个持有的指针都会增加参考数量,当所有持有指针都消失时,引用对象就被释放了。

服务器

只有一台服务器,并且没有动态分配。相反,实例的寿命比受体(以及可能的IO_Service)更长,因此没有所有异步操作都能信任对象的生命足够长的时间。

连接

每个客户端都会产生一个新的连接,动态分配(make_shared)tcp_connection实例,然后在其上启动异步操作。

服务器执行不是保留共享销钉的副本,因此,当连接完成所有async操作时(例如,因为丢弃了连接),tcp_connection对象将被释放。

但是,由于对象必须不是在进行异步操作时被销毁,因此您需要将完成处理程序绑定到共享指针(shared_from_this)而不是this

相关内容

  • 没有找到相关文章

最新更新