来自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将永远存在,除非发生错误或强行关闭服务器?
答案 0 :(得分:0)
boost::bind
返回一个函数对象,其中包含引用的shared_ptr
的副本,在本例中为new_session
。 async_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
将保持活动状态。)