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

Right usage of Qt5 elements regarding memory management

我有以下常见情况:

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 元素使用 class 成员变量并在 QDialog A 销毁后删除它们的正确方法吗?

我问的原因:我想避免在我的应用程序中使用原始指针并用智能指针替换它,但不建议将 Qt5 与例如std::shared_ptr!那么我应该使用 https://wiki.qt.io/Smart_Pointers 吗?如果是,哪一个适合我的场景?感谢

这里是摘要:(来自 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的父子系统

所以Qt5如果不混亲子系统使用智能指针是没有问题的!