Qt中QFormLayout中removeRow自动释放内存问题

QFormLayout中removeRow自动释放内存问题

Qt版本:6.5.3

结论: removeWidget不会释放组件的内存,removeRow会强制释放组件的内存

在使用QT进行项目开发时,对于一些动态场景需要对布局进行一些remove操作,通常Qt在布局中移除控件不会自动释放内存,如removeWidget函数,此时可以对控件进行手动内存管理,提前释放等一些其他操作;

这次开发中使用了QFormLayout表单布局,利用addRow能够轻松完成表单格式的布局样式,但在动态场景时,需要移除元素使用了removeRow,此时再手动释放内存则会出现双重释放异常导致崩溃

问AI表示removeRow不会自动释放内存,经个人验证,removeRow的确会释放掉对应组件的内存空间(与父对象无关),也就是移除后无法再次使用。

验证

这里写了一个简单的验证程序进行验证

    this->resize(400, 300);
    QWidget* centralWidget = new QWidget(this);
    this->setCentralWidget(centralWidget);

    QFormLayout* formLayout = new QFormLayout(this);
    QPushButton* btn1 = new QPushButton("按钮1", this);
    QPushButton* btn2 = new QPushButton("按钮2", this);
    formLayout->addWidget(btn1);
    formLayout->addRow("按钮2", btn2);
    centralWidget->setLayout(formLayout);

    formLayout->removeWidget(btn1);
    delete btn1;
    btn1 = nullptr;

    formLayout->removeRow(btn2);
    delete btn2;
    btn2 = nullptr;

最终异常出现在delete btn2;出现了双重释放。

说明removeRow(btn2)会将内存直接释放掉,也就是在后续代码中将无法使用btn2

如将代码改为

    formLayout->removeWidget(btn1);
    btn2->setText("按钮");

    formLayout->removeRow(btn2);
    btn2->setText("按钮");

异常同样出现在了btn2->setText("按钮");

是否与父对象有关

这里将父对象置为nullptr,手动进行内存管理

    this->resize(400, 300);
    QWidget* centralWidget = new QWidget(this);
    this->setCentralWidget(centralWidget);

    QFormLayout* formLayout = new QFormLayout(this);
    QPushButton* btn1 = new QPushButton("按钮1", nullptr);
    QPushButton* btn2 = new QPushButton("按钮2", nullptr);
    formLayout->addWidget(btn1);
    formLayout->addRow("按钮2", btn2);
    centralWidget->setLayout(formLayout);

    formLayout->removeWidget(btn1);
    delete btn1;
    btn1 = nullptr;

    formLayout->removeRow(btn2);
    delete btn2;
    btn2 = nullptr;

出现异常位置仍为delete btn2;,说明formLayout->removeRow(btn2);会强制释放组件的内存,与父对象无关

posted @ 2025-09-03 11:44  风陵南  阅读(15)  评论(0)    收藏  举报