Если у меня есть класс 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()
?
Да, вам нужно отменить его в деструкторе. Вам также может понадобиться позвонить g_object_ref_sink()
в конструкторе, чтобы получить точный пересчет.
GObject
ы, которые наследуются от GInitiallyUnowned
(а не прямо с базы GObject
) начать с «плавающей» ссылки, которая должна быть «потоплена». Это относится ко всем виджетам GTK, например. Я не знаю, не относится ли это к GMimeObject
или нет, но документация скажет вам (или вы можете позвонить g_object_is_floating()
во время выполнения, чтобы узнать, нужно ли вам потопить его).
Да, вы, вероятно, должны. Было бы самым чистым, чтобы также создать mime_object
в конструкторе, а не принимать необработанный указатель извне. Если вы берете необработанный указатель извне, может быть немного неясно, кто владеет объектом и отвечает за его освобождение.
Также обратите внимание, что вам нужно будет переопределить или отключить конструктор копирования, иначе у вас возникнет ситуация двойного отката, если B
копируется.