2014-02-20 113 views
2

内存管理工作,如果我调用对话是这样的:如何对关闭模式对话框

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

将用户已经关闭对话框后,内存被释放?

请指点我的适当的文档,因为我找不到一个。

回答

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

0

自身不,但你可以连接到finisheddeleteLater它会。虽然像马修建议的堆栈上创建具体实例更好

2

没有单一的文档。

  1. QMessageBoxQObject。它可以由父窗口小部件拥有。当您致电deleteLater时,它也可以通过事件循环删除。

  2. 任何顶级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()。如果没有显示对话框,它永远不会被删除 - 在这里,智能指针会照顾它。或者显示对话框,并删除它自己,或者它被指针删除。

+0

你为什么会说'exec()'不鼓励?由于它创建的本地事件循环? – thuga

+0

感谢您的所有答案。我将这些标记为“正确”,因为它是最丰富的。当然我会使用自动变量。 – kaa

+1

@YuriyVelichko在自动实例上调用'exec()'是可以的,但不要在非模式对话框中执行。理想情况下,您不应该调用任何'exec()'或'waitForXxx'(而不是'main()')。 –