Должны ли мы всегда использовать g_object_ref_sink вместо g_object_ref?

В GLib есть две функции, которые работают с подсчетом ссылок объектов GObject:

  • g_object_ref увеличивает количество ссылок на объект, не обрабатывает плавающие ссылки.
  • g_object_ref_sink увеличивает количество ссылок на объект или просто снимает флаг плавающий с объекта, если ссылка плавающая.

Поскольку мы не знаем, является ли объект плавающим или нет, мы всегда должны использовать g_object_ref_sink, не так ли? Если я ошибаюсь, когда мы должны использовать g_object_ref и когда мы должны использовать g_object_ref_sink? Должны ли мы использовать g_object_ref_sink только для GInitiallyUnowned объектов?


person anton_rh    schedule 19.02.2021    source источник


Ответы (1)


Как правило, вы должны знать тип объекта, с которым вы работаете (т. е. указатели обычно имеют более конкретные типы, чем GObject*), поэтому вы будете знать, является ли он потенциально плавающим или нет. API на основе GObject, использующие плавающие ссылки, задокументированы как использующие их. Все, что не задокументировано как использующее плавающие ссылки, таковым не является.

person Philip Withnall    schedule 19.02.2021