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

标签 c++ visual-studio qt qt5 smart-pointers

我有以下常见场景:

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 时,由于父子关系,它会自动删除obj1obj2。但是,obj3 不会被删除,因为您没有将其设置为子项,因此 obj3 的内存会泄漏。

有很多方法可以处理删除:

  • 手动完成
  • 使用智能指针
  • 使用QObject的父子系统

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

关于c++ - 关于内存管理的 Qt5 元素的正确使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47629510/

相关文章:

c++ - 从动态库 : Debug vs Release 加载 Fortran 函数

c++ - 如何使 QTableWidget 中的单元格小部件的背景不可选?

c++ - Qt: C++: 恢复弹出对话框的几何形状

c++ - boost::unordered_map 使用 boost::interprocess::cached_node_allocator 编译失败

c++ - Has-a关系的继承

c++ - 在 C++ 中读取制表符分隔的文件

c# - 无法在 VS 2022 Enterprise 版本 17.0.0 中编译 Azure Function v4 进程外

visual-studio - 在 Visual Studio 中分析故障转储

c# - 自动取消选中 Nuget 包源

qt - 如何从 QNetworkAccessManager::networkAccessibleChanged() 获取信号?