如果我以这种方式调用对话框:
void foo()
{
QMessageBox* dlg = new QMessageBox( QMessageBox::Critical, "Error", "Unknown Error" );
dlg->exec();
}
用户关闭对话框后会释放内存吗?
请指出相应的文档,因为我找不到一个。
答案 0 :(得分:2)
没有单一的文档。
QMessageBox
是QObject
。它可以由父窗口小部件拥有。当您致电deleteLater
。
任何顶级QWidget
都可以设置Qt::WA_DeleteOnClose
属性 - 它会在关闭时自行删除。
在您的情况下,由于您正在调用(不鼓励)阻塞exec()
方法,因此您无需在堆上分配对话框。它可以是一个自动变量:
QMessageBox dlg(QMessageBox::Critical, "Error", "Unknown Error");
dlg.exec();
但理想情况下,您应该显示对话框,并将其设置为在关闭时自行删除:
QScopedPointer<QMessageBox> dlg(new QMessageBox(QMessageBox::Critical, "Error", "Unknown Error"));
dlg->setAttribute(Qt::WA_DeleteOnClose);
dlg.take()->show();
智能指针用于防止构造函数失败时发生泄漏,或者稍后更改代码并且代码路径错过show()
。如果没有显示对话框,则不会删除它 - 在这里,智能指针会处理它。显示对话框,并删除自身,或者由指针删除。
答案 1 :(得分:0)
在您的情况下,它会泄漏与dlg
相关联的内存。
您希望将代码更改为:
void foo()
{
// Stack allocation is faster than heap allocation.
// It also communicates the lifetime of the object better.
QMessageBox dlg( QMessageBox::Critical, "Error", "Unknown Error" );
// This will block until the user closes the message.
int result = dlg.exec();
} // dlg will be release upon losing scope here.
答案 2 :(得分:0)
不是单独,但您可以将finished
连接到deleteLater
,它会。虽然像Matthew建议的那样在堆栈上创建一个具体的实例是更好的