c++ - 在 C++11 中释放动态分配的 uv_timer_t (libuv) 实例

标签 c++ c++11 memory-leaks dynamic-allocation event-loop

我有一个函数需要将任务安排到 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/

相关文章:

c++ - 如何用sfinae检查,type是否有operator()?

c++ - 从 VS 2012 中的 lambda 返回值构造 std::function 时崩溃

c++ - 为什么 std::get_deleter() 总是产生 nullptr

c++ - 返回一个右值——这段代码有什么问题?

c++ - 在类的构造函数中初始化映射时如何避免内存泄漏?

c++ - 用三个相同的姓氏(C++)按姓氏组织名字?

c++ - NtDeviceIoControlFile(查询 IP 地址条目)- STATUS_INVALID_DEVICE_REQUEST

C++ 多态性。方法

jakarta-ee - Java EE 对象监控工具

objective-c - iOS/ManagedObjectContext 中的内存管理