內存管理工作,如果我調用對話是這樣的:如何對關閉模式對話框
void foo()
{
QMessageBox* dlg = new QMessageBox(QMessageBox::Critical, "Error", "Unknown Error");
dlg->exec();
}
將用戶已經關閉對話框後,內存被釋放?
請指點我的適當的文檔,因爲我找不到一個。
內存管理工作,如果我調用對話是這樣的:如何對關閉模式對話框
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()')。 –