g_object_unref()析构函数中的C++ Glib :: Object子类的成员指针?

问题描述:

如果我有C++类从Glib::Object与来自GMime一个指向G_OBJECT(C-接口)导出:g_object_unref()析构函数中的C++ Glib :: Object子类的成员指针?

/* 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()以获得精确的refcount。

GObjectGInitiallyUnowned(而不是直接从基地GObject)继承的s首先带有必须“沉没”的“浮动”引用。例如,所有GTK小部件都是这种情况。我不知道这是否适用于GMimeObject,但是文档会告诉您(或者您可以在运行时调用g_object_is_floating()以确定是否需要将其淹没)。

+0

我想我应该早些发现这个:https://developer.gnome.org/gmime/stable/gmime-question-index.html,无论如何。 – gauteh 2014-10-21 07:49:08

+0

答案其实对于我的具体情况并不正确,但我认为它在一般情况下正确回答了这个问题。我可能应该在构造函数中执行g_object_ref(),然后在desctructor中执行unref()来处理我的情况。 – gauteh 2014-10-21 09:30:02

是的,你可能应该。在构造函数中创建mime_object而不是从外部获取原始指针是最干净的。如果您从外部获取原始指针,则可能有点不清楚谁拥有该对象并负责释放它。

另请注意,您将需要覆盖或禁用复制构造函数,否则如果复制B,则会出现双重复制情况。