(Как) я должен уничтожить uv_async_t?

После того, как я закончу с uv_async_t, я должен уничтожить его, чтобы избежать утечек, верно? Глядя на документы, кажется, что я должен использовать для этого uv_close(), но для этого требуется uv_handle_t*, а не uv_async_t*. Кроме того, похоже, что его приведение (как в uv_close((uv_handle_t *)async, NULL)) приведет к строгому нарушению алиасинга. Это то, что я должен делать в любом случае?


person Tavian Barnes    schedule 08.08.2016    source источник


Ответы (1)


Да, вам нужно преобразовать uv_async_t* в uv_handle_t*. Вот как работает libuv внутри.

Все дескрипторы имеют общую базовую структуру, поэтому строгие правила присвоения псевдонимов IIRC не нарушаются, поскольку это равносильно приведению его к первому члену структуры.

Примечание к вашему примеру вызова uv_close: вы можете освободить память только для дескриптора в обратном вызове close, а не раньше, поэтому, если вы передадите NULL и дескриптор был выделен в куче, вы не будете знать, когда вы можете освободить память .

person saghul    schedule 10.08.2016
comment
К сожалению, uv_async_t не имеет uv_handle_t в качестве первого члена; вместо этого он дублирует поля. Но да, похоже, это то, что я должен сделать в любом случае. Спасибо за совет по поводу обратного вызова uv_close()! - person Tavian Barnes; 10.08.2016