После того, как я закончу с uv_async_t
, я должен уничтожить его, чтобы избежать утечек, верно? Глядя на документы, кажется, что я должен использовать для этого uv_close()
, но для этого требуется uv_handle_t*
, а не uv_async_t*
. Кроме того, похоже, что его приведение (как в uv_close((uv_handle_t *)async, NULL)
) приведет к строгому нарушению алиасинга. Это то, что я должен делать в любом случае?
(Как) я должен уничтожить uv_async_t?
Ответы (1)
Да, вам нужно преобразовать uv_async_t*
в uv_handle_t*
. Вот как работает libuv внутри.
Все дескрипторы имеют общую базовую структуру, поэтому строгие правила присвоения псевдонимов IIRC не нарушаются, поскольку это равносильно приведению его к первому члену структуры.
Примечание к вашему примеру вызова uv_close
: вы можете освободить память только для дескриптора в обратном вызове close, а не раньше, поэтому, если вы передадите NULL и дескриптор был выделен в куче, вы не будете знать, когда вы можете освободить память .
person
saghul
schedule
10.08.2016
К сожалению,
uv_async_t
не имеет uv_handle_t
в качестве первого члена; вместо этого он дублирует поля. Но да, похоже, это то, что я должен сделать в любом случае. Спасибо за совет по поводу обратного вызова uv_close()
!
- person Tavian Barnes; 10.08.2016