编写以下代码是否可以?
#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
之类的东西?
答案 0 :(得分:0)
deadline_timer
是basic_deadline_timer< boost::posix_time::ptime >
的typedef。 basic_deadline_timer
继承了basic_io_object
。 basic_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。
在异步操作不等待截止时间的意义上似乎不行,并且将被取消,而不是正常执行。