g_object_new должен иметь соответствие g_object_unref?

Я использую 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()?

5
задан legends2k 17 May 2010 в 10:37
поделиться

2 ответа

Да, если только ссылка не является "плавающей". Подклассы GInitiallyUnowned используют плавающие ссылки; наиболее часто они используются в виджетах GTK.

Когда вы создаете виджет GTK с помощью функции gtk_whatever_new(), он имеет одну ссылку, которая помечена как плавающая. Когда вы добавляете виджет в контейнер, контейнер также должен содержать ссылку на виджет. Но вместо того, чтобы вызвать g_object_ref() на виджете и увеличить количество ссылок до 2, он "топит" плавающую ссылку объекта и превращает ее в обычную ссылку. Можно сказать, что контейнер теперь "владеет" виджетом.

Затем, когда вы уничтожаете контейнер, он вызывает g_object_unref() для виджета, количество ссылок становится равным нулю, и виджет уничтожается. Таким образом, вы больше не несете ответственности за его уничтожение.

Таким образом, с обычными GObject, которые обычно не помещаются в контейнеры, не происходит передачи прав собственности. Вы должны сами удалить их, когда закончите с ними.

11
ответ дан 18 December 2019 в 13:11
поделиться

Ответ - да, я понял это из страницы о владении Gnome , надеюсь, это поможет кому-то позже.

3
ответ дан 18 December 2019 в 13:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: