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);会强制释放组件的内存,与父对象无关

浙公网安备 33010602011771号