我有以下常见场景:
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如果是,哪一个适合我的场景?谢谢
最佳答案
这是一个摘要:(来自 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用智能指针是没有问题的!
关于c++ - 关于内存管理的 Qt5 元素的正确使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47629510/