Я использую libnotify для показа настольных уведомлений в моем приложении; notify_notification_new()
возвраты a NotifyNotification*
, который должен быть передан как первый параметрический усилитель дальнейшим вызовам функции библиотеки уведомления.
Существует нет notify_notification_free()
который освобождает указатель, он возвращается. Я искал источник notify_notification_new()
и внутренне это делает a g_object_new()
, получает GObject* и возвращает его как a NotfiyNotification*
, таким образом, когда мое приложение делает уборку, должен я называть a g_object_unref()
на указателе, возвращенном notify_notification_new()
?
Да, если только ссылка не является "плавающей". Подклассы GInitiallyUnowned
используют плавающие ссылки; наиболее часто они используются в виджетах GTK.
Когда вы создаете виджет GTK с помощью функции gtk_whatever_new()
, он имеет одну ссылку, которая помечена как плавающая. Когда вы добавляете виджет в контейнер, контейнер также должен содержать ссылку на виджет. Но вместо того, чтобы вызвать g_object_ref()
на виджете и увеличить количество ссылок до 2, он "топит" плавающую ссылку объекта и превращает ее в обычную ссылку. Можно сказать, что контейнер теперь "владеет" виджетом.
Затем, когда вы уничтожаете контейнер, он вызывает g_object_unref()
для виджета, количество ссылок становится равным нулю, и виджет уничтожается. Таким образом, вы больше не несете ответственности за его уничтожение.
Таким образом, с обычными GObject
, которые обычно не помещаются в контейнеры, не происходит передачи прав собственности. Вы должны сами удалить их, когда закончите с ними.
Ответ - да, я понял это из страницы о владении Gnome , надеюсь, это поможет кому-то позже.