内存管理如何在关闭模式对话框上工作

时间:2014-02-20 23:44:08

标签: qt

如果我以这种方式调用对话框:

void foo()
{
    QMessageBox* dlg = new QMessageBox( QMessageBox::Critical, "Error", "Unknown Error" );        
    dlg->exec();
}

用户关闭对话框后会释放内存吗?

请指出相应的文档,因为我找不到一个。

3 个答案:

答案 0 :(得分:2)

没有单一的文档。

  1. QMessageBoxQObject。它可以由父窗口小部件拥有。当您致电deleteLater

  2. 时,也可​​以通过事件循环删除它
  3. 任何顶级QWidget都可以设置Qt::WA_DeleteOnClose属性 - 它会在关闭时自行删除。

  4. 在您的情况下,由于您正在调用(不鼓励)阻塞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.

请参阅QMessageBox::exec

答案 2 :(得分:0)

不是单独,但您可以将finished连接到deleteLater,它会。虽然像Matthew建议的那样在堆栈上创建一个具体的实例是更好的