C++,Qt : deallocation of "non attribute" objects created in constructor

标签 c++ qt memory-management new-operator

在下面的 Qt 类示例中,许多对象是在构造函数和构造函数调用的函数中创建的,但不是由属性指针指向的,据我所知,不能在析构函数中删除(有在关键字 delete 的任何文件中都不存在)。

http://qt-project.org/doc/qt-4.8/widgets-groupbox.html

在window.h中

class Window : public QWidget
{
    Q_OBJECT

public:
     Window(QWidget *parent = 0);

private:
     QGroupBox *createFirstExclusiveGroup();
     QGroupBox *createSecondExclusiveGroup();
     QGroupBox *createNonExclusiveGroup();
     QGroupBox *createPushButtonGroup();
};

在window.cpp中

Window::Window(QWidget *parent)
     : QWidget(parent)
 {
     QGridLayout *grid = new QGridLayout;
     grid->addWidget(createFirstExclusiveGroup(), 0, 0);
     grid->addWidget(createSecondExclusiveGroup(), 1, 0);
     grid->addWidget(createNonExclusiveGroup(), 0, 1);
     grid->addWidget(createPushButtonGroup(), 1, 1);
     setLayout(grid);

     setWindowTitle(tr("Group Boxes"));
     resize(480, 320);
 }

 QGroupBox *Window::createFirstExclusiveGroup()
 {
     QGroupBox *groupBox = new QGroupBox(tr("Exclusive Radio Buttons"));

     QRadioButton *radio1 = new QRadioButton(tr("&Radio button 1"));
     QRadioButton *radio2 = new QRadioButton(tr("R&adio button 2"));
     QRadioButton *radio3 = new QRadioButton(tr("Ra&dio button 3"));

     radio1->setChecked(true);

     QVBoxLayout *vbox = new QVBoxLayout;
     vbox->addWidget(radio1);
     vbox->addWidget(radio2);
     vbox->addWidget(radio3);
     vbox->addStretch(1);
     groupBox->setLayout(vbox);

     return groupBox;
 }

我是不是遗漏了什么或者它是一个“糟糕”的实现示例? 正确的实现是将指针作为类 Window 的属性并销毁它们在 ~Window() 中指向的内容吗?谢谢。

最佳答案

因为所有对象都被添加到对象树中,所以它们会被自动删除。

例如所有小部件都添加到布局中,布局本身在窗口中设置。这将创建一个对象树。

您可以使用方法 QObject::dumpObjectTree() 获取当前对象树的可视化表示。

另见 Object Trees & Ownership在 Qt 文档中了解详细信息。

关于C++,Qt : deallocation of "non attribute" objects created in constructor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22857891/

相关文章:

c++ - 删除类数组指针时出错

c++ - 带有字符显示的 vector

c++ - 有没有办法在集合中引用类的方法?

c++ - 使用 C++ 从 URL 下载

java - 使用线程分配内存

c++ - OpenGL 模板测试发生在片段程序运行之前还是之后?

c++ - 通过此指针调用 protected 基类方法并转换为派生类中的基类 (C++)

c++ - Qt Creator 4.0.2 和 Beaglebone Black 与 Ubuntu 16.04.3

c++ - 如何在 C++ 中选择堆分配与堆栈分配?

algorithm - Web 服务器上分配的内存增长