Подробности

[В начало]

Проблема в реализации № D0071

Краткое описание

При вызове функции g_type_class_unref() не происходит деструкции динамического родительского класса

Подробное описание

При уменьшении количества ссылок на динамический класс, расширяющий динамический родительский класс, до нуля посредством функции g_type_class_unref() не производится деструкции родительского класса.

Раздел стандарта

Linux Standard Base Desktop Specification 3.1, Chapter 12. Libraries, 12.5.1 glib-2.0/glib-object.h, который ссылается на http://www.gtk.org/api/2.6/gobject/gobject-Type-Information.html#g-type-class-unref

Способ воспроизведения

  1. Производится фиктивная реализация GTypePlugin, устанавливающая значение выходного параметра 'GTypeInfo *info' методов g_type_plugin_complete_type_info()' и 'g_type_plugin_complete_interface_info()' на основе значения параметра 'GType g_type'.
  2. Создается простая иерархия из трех классов:
    • Статический фундаментальный класс"GTTPFSet".
    • Прямой динамический наследник класса"GTTPFSet" - класс "GTTPDynSet".
    • Прямой динамический наследник класса "GTTPDynSet" - класс "GTTPDynList", реализующий также динамический интерфейс "GTTPIDynList".
  3. Все три динамических типа регистрируются функцией
    "g_type_register_dynamic()", используя один и тот же экземпляр класса GTypePlugin
    из P.1.
  4. Количество ссылок на класс "GTTPDynList" увеличивается на одну и сразу же уменьшается.
Тестовый сценарий, демонстрирующий данную ошибку можно скачать здесь.

Способы устранения

При запуске процесса в режиме отладки с исходными кодами библиотеки Glib-GObject v.2.6.5 можно видеть, что количество ссылок на динамический родительский класс "GTTPDynSet", при вызове функции g_type_class_ref() для динамического класса "GTTPDynList" в первый раз, увеличивается дважды. Возможным решением в данном случае может быть введение дополнительно флага "just_initialized", для предотвращения такого поведения функции g_type_class_ref().

Компонент

gtk-gobject 2.6.2 or later

Принято

Gnome Bugzilla 520094

[В начало]