正确使用Qt5元素有关内存管理

时间:2017-12-04 08:47:54

标签: c++ visual-studio qt qt5 smart-pointers

我有以下常见情况:

class A : public QDialog
{
    Q_OBJECT
public:
    A(QWidget *parent=0);
private:
    QFormLayout *m_formLayout;
    QLinedEdit *m_lineEditTest;
};

A::A(QWidget *parent)
{
    m_formLayout = new QFormLayout(ui.widget_Test);
    m_formLayout->setMargin(0);
    m_formLayout->setSpacing(0);

    m_lineEditTest = new QLineEdit();
    m_formLayout->addWidget(m_lineEditTest);

    ui.widget_Test->setLayout(m_formLayout);
}

A::~A()
{
    delete m_lineEditTest, m_formLayout;
}

这是使用Qt GUI元素的类成员变量并在销毁QDialog A后删除它们的正确方法吗?

为什么我要问:我想避免在我的应用程序中使用原始指针并用智能指针替换它,但是不建议将Qt5用于例如的std :: shared_ptr的!那么我应该使用https://wiki.qt.io/Smart_Pointers,如果是,我的情景是哪一个? THX

1 个答案:

答案 0 :(得分:1)

以下是摘要:(来自https://forum.qt.io/topic/65443/raw-pointers-in-qt/5

class MyObject : public QObject
{
    Q_OBJECT

public:
    MyObject(QObject *parent = nullptr) {
        obj1 = new QObject(this); // Sets the parent using the 'parent' constructor parameter

        obj2 = new QObject;
        obj2->setParent(this); // Sets the parent using QObject::setParent()

        obj3 = new QObject; // No parent
    }

private:
    QObject *obj1;
    QObject *obj2;
    QObject *obj3;
};

当您删除MyObject时,由于父子关系,它会自动删除obj1obj2。但是,obj3不会被删除,因为您没有将其设置为子项,因此obj3的内存会被泄露。

有很多方法可以处理删除:

  • 手动执行
  • 使用智能指针
  • 使用QObject的父子系统

因此,如果您不将智能指针与父子系统混合使用,那么使用智能指针是没有问题的!