【问题标题】:(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() 回调的提示!