【问题标题】:(How) am I supposed to destroy a uv_async_t?(如何)我应该销毁 uv_async_t 吗?
【发布时间】:2016-08-08 15:31:56
【问题描述】:

在我处理完 uv_async_t 之后,我应该销毁它以避免任何泄漏,对吗?看一眼文档,我似乎应该为此使用uv_close(),但它需要uv_handle_t*,而不是uv_async_t*。此外,看起来强制转换它(如uv_close((uv_handle_t *)async, NULL))会导致严格的别名违规。这是我应该做的吗?

【问题讨论】:

    标签: node.js strict-aliasing libuv


    【解决方案1】:

    是的,您必须将 uv_async_t* 转换为 uv_handle_t*。这就是 libuv 内部的工作原理。

    所有句柄共享基本结构,因此不会破坏 IIRC 严格的别名规则,因为它相当于将其转换为结构的第一个成员。

    关于您对 uv_close 的示例调用的注释:您只能在关闭回调中为句柄释放内存,而不是之前,因此如果您传递 NULL 并且句柄是在堆上分配的,您将不知道何时你可以释放内存。

    【讨论】:

    • 不幸的是uv_async_t 没有uv_handle_t 作为它的第一个成员;相反,它duplicates the fields。但是,是的,看来这就是我应该做的。感谢您提供有关 uv_close() 回调的提示!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    • 2020-01-04
    • 1970-01-01
    相关资源
    最近更新 更多