(How) am I supposed to destroy a uv_async_t?

2019-07-16 01:12发布

After I'm done with a uv_async_t, I'm supposed to destroy it to avoid any leaks, right? From glancing at the docs, it appears I'm supposed to use uv_close() for this, but it takes a uv_handle_t*, not a uv_async_t*. Furthermore, it looks like casting it (as in uv_close((uv_handle_t *)async, NULL)) would cause a strict aliasing violation. Is that what I'm supposed to do anyway?

1条回答
Viruses.
2楼-- · 2019-07-16 01:47

Yes, you have to cast the uv_async_t* to uv_handle_t*. That's how libuv internally works.

All handles share the base structure, so IIRC strict aliasing rules are not broken because it amounts to casting it to the first member of the structure.

A note on your example call to uv_close: you can only free the memory for a handle in the close callback, not before, so if you pass NULL and the handle was allocated on the heap you won't know when you can free the memory.

查看更多
登录 后发表回答