2010-05-17 13 views
5

Estoy usando libnotify para mostrar notificaciones de escritorio en mi application; notify_notification_new() devuelve un NotifyNotification*, que se debe pasar como el primer param para llamadas de funciones adicionales de la biblioteca de notificaciones.¿Debería un g_object_new tener un g_object_unref coincidente?

No hay notify_notification_free() que libere el puntero que devuelve. Busqué la fuente de notify_notification_new() e internamente lo hace un g_object_new(), consigue un GObject * y lo devuelve como un NotfiyNotification*, así que cuando mi solicitud hace la limpieza, debería llamar a un g_object_unref() en el puntero devuelto por notify_notification_new()?

Respuesta

10

Sí, a menos que la referencia sea "flotante". Las subclases de GInitiallyUnowned usan referencias flotantes; el uso más común es widgets GTK.

Cuando crea un widget GTK utilizando una función gtk_whatever_new(), tiene una referencia que está marcada como flotante. Cuando agrega el widget a un contenedor, el contenedor también debe contener una referencia al widget. Pero en lugar de llamar al g_object_ref() en el widget y aumentar la cuenta de referencia a 2, "hunde" la referencia flotante del objeto y la convierte en una referencia normal. Se podría decir que el contenedor ahora "posee" el widget.

Luego, cuando destruye el contenedor, llama al g_object_unref() en el widget, y el recuento de referencias se convierte en cero, y el widget se destruye. De esa forma, ya no eres responsable de destruirlo tú mismo.

Por lo tanto, con normal GObject s, que normalmente no van en contenedores, no hay transferencia de propiedad. Usted debe desvincularlos usted mismo cuando termine con ellos.

+0

Eso fue perspicaz; Gracias por la info. – legends2k

+0

@ptomato ¿qué encabezados adicionales necesito para llamar 'g_object_unref()'? Actualmente estoy incluyendo solo 'libnotify/notify.h'. –

+0

'#include ' – ptomato

Cuestiones relacionadas