g_object_unref () указатель на член подкласса C ++ Glib :: Object в деструкторе?

Если у меня есть класс C ++, производный от Glib::Object с указателем на g_object (C-интерфейс) из GMime:

 /* schematic set up of class */
class B : public Glib::Object {
public:
GMimeObject * mime_object;
};

mime_object создается и затем передается class B после создания экземпляра Это не g_object_unref()«Ред. Нужно ли мне g_object_unref() это в деструкторе class B::~B()?

0

Решение

Да, вам нужно отменить его в деструкторе. Вам также может понадобиться позвонить g_object_ref_sink() в конструкторе, чтобы получить точный пересчет.

GObjectы, которые наследуются от GInitiallyUnowned (а не прямо с базы GObject) начать с «плавающей» ссылки, которая должна быть «потоплена». Это относится ко всем виджетам GTK, например. Я не знаю, не относится ли это к GMimeObject или нет, но документация скажет вам (или вы можете позвонить g_object_is_floating() во время выполнения, чтобы узнать, нужно ли вам потопить его).

0

Другие решения

Да, вы, вероятно, должны. Было бы самым чистым, чтобы также создать mime_object в конструкторе, а не принимать необработанный указатель извне. Если вы берете необработанный указатель извне, может быть немного неясно, кто владеет объектом и отвечает за его освобождение.

Также обратите внимание, что вам нужно будет переопределить или отключить конструктор копирования, иначе у вас возникнет ситуация двойного отката, если B копируется.

0

По вопросам рекламы [email protected]