C++ 为什么新会话共享不在这里销毁?

C++ 为什么新会话共享不在这里销毁?,c++,boost,boost-asio,shared-ptr,C++,Boost,Boost Asio,Shared Ptr,从 typedef boost::共享会话会话; void start_accept() { 聊天室会话ptr新会话(新聊天室会话(io服务,房间)); acceptor\异步\u accept(新建会话->套接字(), boost::bind(&chat\u server::handle\u accept,这个,新的\u会话, boost::asio::占位符::错误); } 无效句柄\u接受(聊天会话\u ptr会话, 常量boost::系统::错误(代码和错误) { 如果(!错误) { 会

typedef boost::共享会话会话;
void start_accept()
{
聊天室会话ptr新会话(新聊天室会话(io服务,房间));
acceptor\异步\u accept(新建会话->套接字(),
boost::bind(&chat\u server::handle\u accept,这个,新的\u会话,
boost::asio::占位符::错误);
}
无效句柄\u接受(聊天会话\u ptr会话,
常量boost::系统::错误(代码和错误)
{
如果(!错误)
{
会话->开始();
}
开始接受();
为什么
new\u session
shared ptr没有被销毁?如果我理解正确,那么
acceptor.async\u accept
会作为异步调用立即返回?所以当
start\u accept
函数返回时,共享ptr不会被删除

由于新的会话类有一个socket成员,sockets的生存期与这个新的会话绑定在一起,所以读写tcp消息的能力也是如此,不是吗

----编辑--- 根据比利·奥尼尔的回答:我还有一个问题


因此,除非发生错误或我强制关闭服务器,否则新会话将永远存在?

boost::bind
返回一个函数对象,该函数对象包含引用的
共享\u ptr
的副本,在这种情况下
新会话
异步\u accept可能是异步的,但它需要存储目标函数的副本Action对象,以便在异步请求完成时调用该函数。

是,
chat\u会话只要处于“活动”状态,即不会发生错误。其生命周期可分为两部分:

1) 在调用其
start
成员函数之前,
chat\u session
实例将保持活动状态,因为
shared\u ptr
绑定到
acceptor\u
的完成处理程序。当调用完成处理程序时,它将从
io\u服务
队列中删除,并使用其
shared\u ptr
销毁。如何处理如果成功接受连接,则完成处理程序将启动第二阶段:

2) 调用
chat\u session::start
时,
chat\u session
会在
聊天室
管理器中注册自身

room_.join(shared_from_this());
它在某个容器中存储了一个
shared\u ptr
。此
shared\u ptr
chat\u session::start
中从容器中删除,该过程在出现错误时调用


(实际上,即使没有此注册,
聊天会话
也会保持活动状态,因为每个异步操作都使用了此
共享习惯用法。)

因此,除非出现错误或我强制关闭服务器,否则新会话将永远存在?它可能和acceptor一样长,但我不是asio专家。这个答案取决于所有基于回调的API的工作方式。
room_.join(shared_from_this());