c++ - qt垃圾回收和智能指针

标签 c++ qt smart-pointers

我正在考虑在我的 qt 工作中开始使用智能指针。让我感到困惑的是智能指针如何与 Qt 垃圾收集一起使用。整个 Qt 依赖于子 QObject 以 QObject* parent 作为 ctor 参数构造的习语,因此启用垃圾收集。 例如:

     QWidget* mWidget = new QWidget(this);//Here we not only 
                                          //ensure that mWidget will be deleted  
                                          //when its parent is deleted, but also tell qt,  
                                          //that mWidget is not a window, but belongs to 
                                          //parent's layout         

现在,如果我想将 mWidget 包装到智能指针中。

 typedef QScopedPointer<QWidget> WidgPtr;
 WidgPtr mWidget = WidgPtr(new QWidget(this));

但是现在,当调用父级的 dtor 时,它将对 mWidget 的指针调用 delete 两次。首先是由于垃圾收集,其次是调用智能指针 dtor。

当然我们可以构造没有parent的mWidget,然后改变一些标志来关闭窗口行为或者调用setParent()(但是mWidget同样会被删除两次)。但对我来说,做如此复杂的初始化只是为了能够使用智能指针而不是原始指针,这太过分了。 或者也许我想念什么? 谢谢。

最佳答案

QScopedPointerQSharedPointer 不知道它们的目标对象是存活还是死亡,所以如果您将智能指针保留在成员变量之外的任何其他地方,那么是的,在您的案例析构函数可能会被调用两次。这就是为什么这些类型的智能指针不适合 QObjects(但当您的对象没有父对象时它们仍然有用)。

如果您需要保留指向QObject 的 protected 指针,请使用QPointer : 一旦对象被销毁,它将变为 null,因此您可以随时 delete 它而不必担心造成任何困惑。但请记住 QPointer不会在析构函数中销毁引用的对象。在大多数情况下,您应该构建 QObjects 的层次结构,并让所有权系统清理内存。

关于c++ - qt垃圾回收和智能指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12871415/

相关文章:

c++ - 放弃 auto_ptr

没有类型转换的模板化派生类的 C++ 访问成员

c++ - 什么是 undefined reference /未解析的外部符号错误以及如何修复它?

c++ - 关于在 C++ 模板化队列中实现 put() 函数的建议?

qt - 鼠标事件未在 QQuickItem 继承者中处理

c++ - QML TableView 使用 QtQuick.Controls 2 单击行

c++ - boost shared_ptr : using unique() to implement copy on write

c++ - 在 C++ 初始化列表中使用整型文字

c++ - 将事件/ Action 连接到 QPlainTextEdit

c++ - Opencv,对 `cv::imread(??cv::String const&???, int)' 的 undefined reference