【问题标题】:g_object_unref() member pointer of C++ Glib::Object sub-class in destructor?析构函数中C ++ Glib :: Object子类的g_object_unref()成员指针?
【发布时间】:2014-12-15 08:33:29
【问题描述】:

如果我有从Glib::Object 派生的 C++ 类,并带有指向来自 GMime 的 g_object(C 接口)的指针:

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

mime_object 被创建,然后在实例化时传递给class B。它不是g_object_unref()'ed。我应该在析构函数class B::~B()g_object_unref() 吗?

【问题讨论】:

    标签: c++ glib gobject


    【解决方案1】:

    是的,您需要在析构函数中取消引用它。您可能还需要在构造函数中调用 g_object_ref_sink() 才能完全正确地进行引用计数。

    GObjects 继承自 GInitiallyUnowned(而不是直接从基础 GObject)以“浮动”引用开始,该引用必须是“沉没”的。例如,所有 GTK 小部件都是这种情况。我不知道这是否适用于GMimeObject,但文档会告诉你(或者你可以在运行时调用g_object_is_floating() 来确定是否需要下沉它)。

    【讨论】:

    • 我想我应该早点发现这个:developer.gnome.org/gmime/stable/gmime-question-index.html,无论如何谢谢。
    • 答案实际上对于我的特定情况并不正确,但我认为它在一般情况下正确回答了问题。对于我的情况,我可能应该在构造函数中执行 g_object_ref()(然后在析构函数中执行 unref())。
    【解决方案2】:

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

    另外请注意,您将需要覆盖或禁用复制构造函数,否则如果 B 被复制,您将遇到双重取消引用的情况。

    【讨论】:

      猜你喜欢
      • 2016-09-19
      • 1970-01-01
      • 2015-12-05
      • 1970-01-01
      • 2010-11-02
      • 1970-01-01
      • 1970-01-01
      • 2018-09-12
      • 2016-01-17
      相关资源
      最近更新 更多