是否可以在dadline_timer对象销毁后调用它
Is it ok to call dadline_timer object after its destruction
可以
编写以下代码吗?
#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_timer
是 basic_deadline_timer< boost::posix_time::ptime >
的类型定义。 basic_deadline_timer
继承了basic_io_object
。basic_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,
这似乎是可以的。从某种意义上说,异步操作不会等待截止时间,并且将被取消,而不是正常执行,这似乎是不行的。
相关文章:
- 是什么让放置新调用对象的构造函数?
- 当我调用对象的方法时,对象的成员会发生变化
- 为什么静态数组成员变量在调用对象的实例后不显示任何内容?
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- 如何从构造函数副本 T(const T&)调用对象 T?
- C++17 如何保存泛型可调用对象以供以后使用
- 检查模板中 nullptr 的函数指针,了解任何类型的可调用对象
- 是否可以在编译时初始化对象的 C 样式函数指针,以便它调用对象的成员函数?
- 如何在C++中将可调用对象放入地图中?
- 在销毁期间从另一个线程调用对象上调用方法是否未定义行为?
- 广义 std::function (std::any 表示可调用对象)
- c++ 替换调用对象方法的宏函数
- 将可调用对象传递给采用 std::function 的构造函数
- 双指针在使用 new 时不调用对象构造函数
- 可调用对象作为默认模板参数
- 只需调用对象即可获取对象数据
- 如果用户尝试从 JS 调用对象的未定义函数C++则回调C++代码
- 如何将当前替代类型的 std::variant 传递给可调用对象?
- C++对象本身作为参数调用对象的方法
- 从移交的类调用对象