我有一个函数需要将任务安排到 libuv 事件循环。我的想法是创建一个超时为 0 毫秒的计时器。我尝试了以下代码:
void myFunction() {
...
uv_timer_t* timer = new uv_timer_t();
uv_timer_init(uv_default_loop(), timer);
uv_timer_start(timer, [&](uv_timer_t* timer, int status) {
// Scheduled task
}, 0, 0);
}
这种方法很有效,但问题是,动态分配的定时器永远不会被释放。我曾尝试在回调中释放计时器,但这导致了段错误:
void myFunction() {
...
uv_timer_t* timer = new uv_timer_t();
uv_timer_init(uv_default_loop(), timer);
uv_timer_start(timer, [&](uv_timer_t* timer, int status) {
// Scheduled task
delete timer;
}, 0, 0);
}
我也试过调用 uv_timer_stop(timer);
和 uv_unref((uv_handle_t*) timer);
在实际内存释放之前,但段错误仍然存在.
最佳答案
我遇到了同样的问题,这是你的处理方式:
首先,您需要为计时器句柄关闭时创建一个回调:
void on_timer_close_complete(uv_handle_t* handle)
{
free(handle);
}
请注意句柄将在回调中被释放。
当你停止并释放你的定时器时,你会这样做:
uv_timer_stop(pTimerHandle);
uv_close((uv_handle_t *)pTimerHandle,on_timer_close_complete);
不直观的部分是 uv_close()
调用。我不认为我在文档中的任何地方看到过它。我只能通过关注来源来解决这个问题。
这样,libuv 将在完成计时器后执行您的回调,然后您可以在该回调中安全地释放它。
关于c++ - 在 C++11 中释放动态分配的 uv_timer_t (libuv) 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19404177/