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

时间:2016-02-02 07:56:18

标签: c++ boost boost-asio

编写以下代码是否可以?

#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之类的东西?

1 个答案:

答案 0 :(得分:0)

deadline_timerbasic_deadline_timer< boost::posix_time::ptime >的typedef。 basic_deadline_timer继承了basic_io_objectbasic_io_object的{​​{3}}执行

get_service().destroy(get_implementation());

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

文档似乎没有明确说明(或者我无法找到),但据我所知,deadline_timer必须符合destructor概念。它断言

  

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

  

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

所以,从某种意义上说,被破坏的计时器不会被异步任务引用,所以它似乎没有问题,因此不会成为UB。

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