关于内存管理的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元素的正确方法,并在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
时,由于亲子关系,它将自动删除obj1
和obj2
。但是,obj3
不会被删除,因为您没有将其设置为一个孩子,因此obj3
的内存被泄漏了。
有很多方法可以处理删除:
- 手动做
- 使用智能指针
- 使用Qobject的父子系统
因此,如果您不将其与亲子系统混合使用智能指针,则没有问题!
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 使用不带参数的函数访问结构元素
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- C++如何通过用户输入删除列表元素
- lower_bound()返回最后一个元素
- 基于多个条件处理地图中的所有元素
- 调整大小后指向元素值的指针unordered_map有效?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 使用函数"remove"删除重复元素
- 具有最大子序列大小的序列,每个元素都相同
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将元素添加到数组的线程安全函数?
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- 我想访问std::unique_ptr中的一个特定元素
- 如何通过 getter 函数删除矢量的元素?
- 关于内存管理的QT5元素的正确用法
- QXmlStreamReader (Qt5):获取标签内的所有子元素
- 如何将gstreamer 1.0视频元素添加到qt5应用程序中