2014-02-20 162 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()')。 –