2016-08-08 5 views
2

私はuv_async_tで終わった後、漏れを避けるためにそれを破壊するはずですよね?ドキュメントを見ると、uv_close()を使用するはずですが、uv_async_t*ではなくuv_handle_t*が必要です。さらに、キャスト(uv_close((uv_handle_t *)async, NULL))のように見えると、厳密なエイリアス違反が発生します。とにかくそれは私がやるべきことですか?(どうやって)私はuv_async_tを破壊するはずですか?

答えて

3

はい、uv_async_t*uv_handle_t*にキャストする必要があります。それがlibuvが内部的にどのように動作するかです。

すべてのハンドルが基本構造を共有するため、IIRCの厳密なエイリアシング規則は構造体の最初のメンバにキャストするため、破壊されません。

uv_closeの例では、close callback内のハンドルのメモリを解放することはできません。NULLを渡してハンドルがヒープに割り当てられた場合は、メモリを解放することができます。

+1

残念ながら、 'uv_async_t'は最初のメンバとして' uv_handle_t'を持っていません。代わりに、フィールドを複製します(https://github.com/libuv/libuv/blob/v1.9.1/include/uv.h#L761)。でも、とにかく私がやるべきことはそうだね。 'uv_close()'コールバックについてのヒントをありがとう! –

関連する問題