(How) am I supposed to destroy a uv_async_t?

2019-07-16 01:46发布

问题:

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:

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.