为什么new_session shared_ptr没有在这里被销毁?

why doesnt new_session shared_ptr not get destroyed here?

本文关键字:在这里 new session shared ptr 为什么      更新时间:2023-10-16

from http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/example/chat/chat_server.cpp

typedef boost::shared_ptr<chat_session> chat_session_ptr;

  void start_accept()
      {
        chat_session_ptr new_session(new chat_session(io_service_, room_));
        acceptor_.async_accept(new_session->socket(),
            boost::bind(&chat_server::handle_accept, this, new_session,
              boost::asio::placeholders::error));
      }
void handle_accept(chat_session_ptr session,
      const boost::system::error_code& error)
  {
    if (!error)
    {
      session->start();
    }
    start_accept();

为什么new_session共享ptr没有被销毁?如果我理解正确,acceptor_.async_accept立即返回,因为它是一个异步调用?所以当start_accept函数返回时,共享的ptr不会被删除吗?

和new_session类有一个套接字成员,套接字的生命周期与这个new_session绑定,所以读写TCP消息的能力也?不是吗?

——编辑根据Billy ONeal的回答:我还有一个问题

所以new_session将永远存在,除非发生错误或我强制关闭服务器?

是的,只要chat_session是"活动的",即没有错误发生。其生命周期可分为两部分:

1)在start成员函数被调用之前,chat_session实例保持活动状态,因为shared_ptr<chat_session>被绑定到acceptor_的完成处理程序。当调用完成处理程序时,它将从io_service队列中删除并与shared_ptr<chat_session>一起销毁。但是,如果连接被成功接受,则完成处理程序将启动第二阶段:

2)当chat_session::start被调用时,chat_session将自己注册到chat_room管理器

room_.join(shared_from_this());

shared_ptr<chat_session>存储在某个容器中。这个shared_ptrchat_session::start的容器中移除,在错误时调用。

(实际上,即使没有这种注册,chat_session也会保持活动,因为shared_from_this习惯用法用于每个异步。操作。)

boost::bind返回一个函数对象,其中包含引用的shared_ptr的副本,在本例中为new_sessionasync_accept可能是异步的,但它需要存储目标函数对象的副本,以便在异步请求完成时调用函数。