析构函数中C++ Glib::Object 子类的 g_object_unref() 成员指针
g_object_unref() member pointer of C++ Glib::Object sub-class in destructor?
如果我有C++从 Glib::Object
派生的类,并带有指向来自 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()
我应该在析构函数class B::~B()
中g_object_unref()
它吗?
是的,您需要在析构函数中取消引用它。您可能还需要在构造函数中调用 g_object_ref_sink()
以使 refcount 完全正确。
从GInitiallyUnowned
继承的GObject
(而不是直接从基本GObject
继承的(以必须"沉没"的"浮动"引用开始。例如,所有 GTK 小部件都是这种情况。我不知道这是否适用于GMimeObject
,但文档会告诉您(或者您可以在运行时调用g_object_is_floating()
以了解是否需要下沉它(。
是的,你可能应该这样做。 在构造函数中创建mime_object
而不是从外部获取原始指针是最干净的。 如果你从外部获取原始指针,可能有点不清楚谁拥有该对象并负责释放它。
另请注意,您将需要覆盖或禁用复制构造函数,否则如果复制B
,您将遇到双重取消引用的情况。
相关文章:
- 当覆盖存在时调用基本虚拟"binded to object"函数
- "Unable to start debugging. No process is associated with this object." - 在Visual Studio Code中使用GDB
- C++将派生类转换为基类时'object slicing'期间发生的情况
- 如何理解 C++17 标准参考中的 [intro.object]/3? N4659 的
- "Cannot convert Python object argument to type '<typename>'" - 使用 Cython 包装 C++ 类时出错
- 使用 object 中的方法调用带有 std::bind 和 std::function.target 的 C 样式函数
- "Called Object Type is Not a Function or Pointer" 与 typedef 和类
- C++线程"Call to non-static member function without an object argument"
- dopen():不以 root 身份运行时"failed to map segment from shared object"
- 当两个成员位于同一类中时出错"a nonstatic member reference must be relative to a specific object"
- Nan::ObjectWrap to Napi::Object Wrap 无法访问 JavaScript 中的属性
- 现代C++会支持 C# "Object Initalizer"语法吗?
- 指向对象生存期之外的已分配内存的指针是"invalid pointer[s]"还是"pointer[s] to an object"?
- C++ Equivalent of Java Map<String, Object>
- WebKit2GTK+ "window-object-cleared"未清除
- 返回 *&object 时是否允许复制/移动省略?
- QPointer::clear() 是删除其引用的指针,还是"Clears this QPointer object."其他含义?
- 解决方法:'can not be used when making a shared object; recompile with -fPIC'使用Cmake。使用普通的 g++ 工作
- 根据标准,究竟什么是"declaration of an object"
- 将unique_ptr作为<Object>unique_ptr<常量对象返回>