Подробности
[В начало]
Проблема в реализации № 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
Способ воспроизведения
- Производится фиктивная реализация GTypePlugin, устанавливающая значение выходного параметра 'GTypeInfo *info' методов g_type_plugin_complete_type_info()' и 'g_type_plugin_complete_interface_info()' на основе значения параметра 'GType g_type'.
- Создается простая иерархия из трех классов:
- Статический фундаментальный класс"GTTPFSet".
- Прямой динамический наследник класса"GTTPFSet" - класс "GTTPDynSet".
- Прямой динамический наследник класса "GTTPDynSet" - класс "GTTPDynList", реализующий также динамический интерфейс "GTTPIDynList".
- Все три динамических типа регистрируются функцией
"g_type_register_dynamic()", используя один и тот же экземпляр класса GTypePlugin
из P.1. - Количество ссылок на класс "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
[В начало]