关于内存管理的 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
时,由于父子关系,它会自动删除obj1
和obj2
。但是,obj3
不会被删除,因为您没有将其设置为子项,因此 obj3
的内存会泄漏。
有多种处理删除的方法:
- 手动执行
- 使用智能指针
- 使用QObject的父子系统
所以Qt5如果不混亲子系统使用智能指针是没有问题的!
我有以下常见情况:
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
时,由于父子关系,它会自动删除obj1
和obj2
。但是,obj3
不会被删除,因为您没有将其设置为子项,因此 obj3
的内存会泄漏。
有多种处理删除的方法:
- 手动执行
- 使用智能指针
- 使用QObject的父子系统
所以Qt5如果不混亲子系统使用智能指针是没有问题的!