关于内存管理的QT5元素的正确用法

Right usage of Qt5 elements regarding memory management

本文关键字:QT5 元素 用法 管理 于内存 内存      更新时间:2023-10-16

我有以下常见方案:

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与E.G一起使用。std :: shared_ptr !因此,我应该使用https://wiki.qt.io/smart_pointers,如果是,我的场景是哪一个?thx

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

因此,如果您不将其与亲子系统混合使用智能指针,则没有问题!