io_service::strand
的构造函数和tcp::socket
之类的io对象引用了io_service
个对象。如果io_service
对象在使用其引用构造的io_service::strand
,tcp::socket
之前破坏了该怎么办?
答案 0 :(得分:1)
io_service::~io_service()
documentation具体描述了这种情况以及解决方法
<强>说明强>
上述破坏序列允许程序简化 使用
shared_ptr<>
进行资源管理。对象的位置 生命周期与连接的生命周期(或其他一些因素)有关 异步操作序列),对象的shared_ptr
绑定到所有相关的异步操作的处理程序 用它。其工作原理如下:当单个连接结束时,所有关联的异步操作 完成。相应的处理程序对象将被销毁 对对象的shared_ptr引用被销毁。关闭了 整个程序,调用io_service函数
stop()
来终止 尽快拨打任何run()
电话。定义了io_service
析构函数 上面会破坏所有处理程序,导致所有shared_ptr
引用 要销毁的连接对象。
答案 1 :(得分:0)
其UB。
我的io_service
用户类在io_service
之后被销毁时,我收到了段错误。
答案 2 :(得分:0)
您描述的案例会导致崩溃。 io_service是强制性的,因为io_service执行对套接字,定时器和您自己的代码的相关异步调用的实际线程执行。为了保护您的代码免受此类灾难的影响,请在创建后立即将io_service :: work添加到您的io_service。在您不再需要io_service之后 - 停止工作和io_service。