为什么new_session shared_ptr没有在这里被销毁?
why doesnt new_session shared_ptr not get destroyed here?
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_ptr
从chat_session::start
的容器中移除,在错误时调用。
(实际上,即使没有这种注册,chat_session
也会保持活动,因为shared_from_this
习惯用法用于每个异步。操作。)
boost::bind
返回一个函数对象,其中包含引用的shared_ptr
的副本,在本例中为new_session
。async_accept
可能是异步的,但它需要存储目标函数对象的副本,以便在异步请求完成时调用函数。
- 努力将整数转换为链表。不知道我在这里做错了什么
- 我可以在这里替换什么,因为我不能在 C# 中使用隐式变量的 lambda 函数?
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- 在将 new 与指针一起使用时,创建数组的指定长度
- File.cpp.o:OpenPose 标志 CMakeFiles/.. 的多重定义/main.cpp.o:首先在这里定
- 为什么thread_local变量在这里从未初始化?
- 为什么我必须在这里使用dynamic_cast
- 在这里,当我们比较 if(vc[i]==vc1[i]) 时,它是向量数组. 实际上比较的值是多少,
- 我正在尝试使用 while 循环从字符串中删除字母,直到没有字母。我在这里做错了什么?
- 为什么 C++20 中的 [[可能]] 属性在这里引发警告?
- 我在这里正确传递参数了吗?
- 为什么gmp会在这里与"invalid next size"重新定位一起崩溃?
- 移动语义在这里如何工作?
- 如何在这里循环运行?
- 为什么枚举变量在这里是右值?
- 我的C++合并排序代码不起作用。我在这里错过了什么?
- 试图美化这个Arduino代码[初学者在这里]
- 在执行new期间是否可以在构造函数中传递不同的参数?
- 双指针在使用 new 时不调用对象构造函数
- 复制交换习惯用法-我们可以在这里使用动态强制转换操作吗