是否可以在dadline_timer对象销毁后调用它

Is it ok to call dadline_timer object after its destruction

本文关键字:调用 对象 timer dadline 是否      更新时间:2023-10-16
可以

编写以下代码吗?

#include <boost/asio.hpp>
#include <boost/bind.hpp>
boost::asio::io_service g_io;
void foo(const boost::system::error_code& e)
{
  // ...
}
int main()
{
  {
    boost::asio::deadline_timer timer(g_io, boost::posix_time::milliseconds(3000));
    timer.async_wait(
      boost::bind(
        foo,
        boost::asio::placeholders::error
      )
    );
  }
  g_io.run();
}

请注意,timer对象将在调用之前被销毁。可以吗,或者我应该在这里使用类似std::shared_ptr的东西?

deadline_timerbasic_deadline_timer< boost::posix_time::ptime > 的类型定义。 basic_deadline_timer继承了basic_io_objectbasic_io_object的析构函数执行

get_service().destroy(get_implementation());

因此,当timer超出范围时,它的实现将被传递给其关联服务的成员函数destroy

文档似乎没有明确说明(或者我找不到在哪里(,但据我所知,deadline_timer必须符合 WaitableTimerService 概念。它断言

a.destroy(b); 隐式取消异步等待操作,就像通过调用 a.cancel(b, e( 一样。

a.cancel(b, e); 使任何未完成的异步等待操作尽快完成。应向已取消操作的处理程序传递错误代码错误::operation_aborted。设置 e 以指示成功或失败。返回已取消的操作数。

因此,从某种意义上说,异步任务不会引用已销毁的计时器,因此不会有 UB,

这似乎是可以的。

从某种意义上说,异步操作不会等待截止时间,并且将被取消,而不是正常执行,这似乎是不行的。