【问题标题】:why doesnt new_session shared_ptr not get destroyed here?为什么新会话 shared_ptr 不会在这里被破坏?
【发布时间】:2013-05-27 07:02:16
【问题描述】:

来自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 共享的指针没有被销毁?如果我理解正确,acceptor_.async_accept 会立即作为异步调用返回?所以start_accept函数返回时共享的ptr不会被删除。

并且由于 new_session 类有一个套接字成员,所以套接字的生命周期与这个 new_session 绑定在一起,所以读写 tcp 消息的能力也可以吗?不是吗?

----编辑--- 基于比利奥尼尔的回答:我还有一个问题

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

【问题讨论】:

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


    【解决方案1】:

    是的,chat_session 只要它处于“活动状态”,即不会发生错误,就会一直存在。它的生命周期可以分为两部分:

    1) 在调用其start 成员函数之前,chat_session 实例保持活动状态,因为shared_ptr&lt;chat_session&gt; 绑定到acceptor_ 的完成处理程序。当调用完成处理程序时,它会从io_service 队列中删除并销毁 - 使用它的shared_ptr&lt;chat_session&gt;。但是,如果成功接受连接,完成处理程序将开始第二阶段:

    2) 当chat_session::start 被调用时,chat_sessionchat_room 管理器中注册自己

    room_.join(shared_from_this());
    

    shared_ptr&lt;chat_session&gt; 存储在某个容器中。这个shared_ptr 被从chat_session::start 中的容器中删除,错误时调用。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 所以 new_session 将永远存在,除非发生错误或我强行关闭服务器?
      • 它的寿命可能和acceptor_一样长;但我不是 asio 专家。这个答案基于所有基于回调的 API 必须如何工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-06
      • 2019-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多