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

g_object_unref() member pointer of C++ Glib::Object sub-class in destructor?

本文关键字:unref object 指针 成员 C++ Glib Object 析构函数 子类      更新时间:2023-10-16

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

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

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

是的,您需要在析构函数中取消引用它。您可能还需要在构造函数中调用 g_object_ref_sink() 以使 refcount 完全正确。

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

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

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

相关文章: