鑒于以下代碼片段:
class MyDialog : public QDialog
{
...
};
MyDialog::~MyDialog()
{
qInfo() << "~MyDialog()";
}
和
// scope begins
MyDialog d;
d.setAttribute( WA_DeleteOnClose, true );
int result = d.exec();
qInfo() << "After exec";
// scope ends
我得到以下輸出
~MyDialog()
雙自由或腐敗(出)
中止(核心轉儲)
沒有d.setAttribute( WA_DeleteOnClose, true );一切都是好的和預期的。
注意:我知道在這種情況下不需要在關閉時使用洗掉,因為對話框在離開范圍時會洗掉。我也不需要“更好的解決方案”等(我已經閱讀了很多關于 SO 和 Qt 中心論壇的帖子,其中包含這些不相關的答案)。問題是為什么在第一次~QDialog()呼叫時會發生錯誤?也許我在第一次~QDialog()呼叫時發生錯誤是對的嗎?
uj5u.com熱心網友回復:
試試這個:
MyDialog* d = new MyDialog;
d->setAttribute( WA_DeleteOnClose, true );
int result = d->exec();
無論是new QobjectDerived或new QobjectDerived(this)動態分配,然后動態釋放可能敲定物件銷毀一次。當對話框關閉但沒有第二個解構式呼叫時,該屬性WA_DeleteOnClose集顯然是在內部引發的,delete就像在堆疊上分配的物件一樣。
uj5u.com熱心網友回復:
您正在堆疊上創建一個物件,然后嘗試洗掉它delete(間接通過 WA_DeleteOnClose - 標志)。我不明白為什么你不會得到雙重洗掉。
uj5u.com熱心網友回復:
我在 Qt 論壇中得到了答案:鏈接。
QDialog該類的源代碼包含以下幾行:
//QDialog::exec()
if (deleteOnClose)
delete this;
return res;
如果this指向堆疊物件,ofc 會導致崩潰。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/353430.html
上一篇:libyaml:檢索根元素的鍵
