为什么new_session shared_ptr不会在这里被破坏?

时间:2013-05-27 07:02:16

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

来自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将永远存在,除非发生错误或强行关闭服务器?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

是的,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_ptr已从chat_session::start中的容器中删除,该错误会调用该文件。

(实际上,即使没有此注册,由于每个异步操作都使用chat_session惯用语,shared_from_this将保持活动状态。)