Должен ли g_object_new иметь соответствующий g_object_unref? - PullRequest
5 голосов
/ 17 мая 2010

Я использую libnotify для отображения уведомлений на рабочем столе в моем приложении ; notify_notification_new() возвращает NotifyNotification*, который должен быть передан в качестве первого параметра для дальнейших вызовов функций библиотеки уведомлений.

Нет notify_notification_free(), который освобождает указатель, который он возвращает. Я посмотрел на источник notify_notification_new(), и внутри он выполняет g_object_new(), получает GObject * и возвращает его как NotfiyNotification*, поэтому, когда мое приложение выполняет очистку, я должен вызвать g_object_unref() по указателю, возвращенному notify_notification_new()?

Ответы [ 2 ]

10 голосов
/ 17 мая 2010

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

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

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

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

3 голосов
/ 17 мая 2010

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

...