如何对关闭模式对话框
问题描述:
内存管理工作,如果我调用对话是这样的:如何对关闭模式对话框
void foo()
{
QMessageBox* dlg = new QMessageBox(QMessageBox::Critical, "Error", "Unknown Error");
dlg->exec();
}
将用户已经关闭对话框后,内存被释放?
请指点我的适当的文档,因为我找不到一个。
答
在你的情况下,它会泄漏与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.
答
自身不,但你可以连接到finished
和deleteLater
它会。虽然像马修建议的堆栈上创建具体实例更好
答
没有单一的文档。
的
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()
。如果没有显示对话框,它永远不会被删除 - 在这里,智能指针会照顾它。或者显示对话框,并删除它自己,或者它被指针删除。
你为什么会说'exec()'不鼓励?由于它创建的本地事件循环? – thuga
感谢您的所有答案。我将这些标记为“正确”,因为它是最丰富的。当然我会使用自动变量。 – kaa
@YuriyVelichko在自动实例上调用'exec()'是可以的,但不要在非模式对话框中执行。理想情况下,您不应该调用任何'exec()'或'waitForXxx'(而不是'main()')。 –