2016-08-08 17 views
2

Nachdem ich mit einem uv_async_t fertig bin, soll ich es zerstören, um irgendwelche Lecks zu vermeiden, richtig? Aus dem Blick auf die Dokumente scheint es, dass ich dafür uv_close() verwenden soll, aber es dauert ein uv_handle_t*, kein uv_async_t*. Darüber hinaus sieht es so aus, als würde es (wie in uv_close((uv_handle_t *)async, NULL)) eine strenge Aliasing-Verletzung verursachen. Soll ich das überhaupt tun?(Wie) soll ich ein uv_async_t zerstören?

Antwort

3

Ja, Sie müssen die uv_async_t* auf uv_handle_t* werfen. So funktioniert libuv intern.

Alle Handles teilen sich die Basisstruktur, daher sind die IIRC-Regeln für das strikte Aliasing nicht gebrochen, weil es auf das erste Mitglied der Struktur übertragen wird.

Ein Hinweis zu Ihrem Beispiel Aufruf an uv_close: Sie können den Speicher nur für ein Handle im close Callback freigeben, nicht vorher, also wenn Sie NULL übergeben und das Handle auf dem Heap zugewiesen wurde, wissen Sie nicht wann kann die Erinnerung freigeben.

+1

Leider hat 'uv_async_t' kein' uv_handle_t' als erstes Mitglied; stattdessen [kopiert die Felder] (https://github.com/libuv/libuv/blob/v1.9.1/include/uv.h#L761). Aber sieht so aus, als ob ich das sowieso tun sollte. Danke für den Tipp zum 'uv_close()' Callback! –