Qt之Qt::WA_DeleteOnClose詳解
阿新 • • 發佈:2019-02-18
當用戶關閉一個主視窗時,預設行為是隱藏它,所以它還會保留在記憶體中。對於數量大的主視窗會造成一定的問題。解決辦法是在建構函式中對Qt::WA_DeleteOnClose的屬性進行設定:
MainMindow::MainWindow( )
{
. . .
setAttribute(Qt::WA_DeleteOnClose);
. . .
} 這樣做就會告訴Qt在關閉視窗將其刪除。
} 這樣做就會告訴Qt在關閉視窗將其刪除。
由Qt::WA_DeleteOnClose造成的野指標問題,在網上搜到的一個求助貼如下
主視窗類QMainWindow的標頭檔案裡定義了一個QDialog類的指標:QDialog *dialog;
現有如下函式語句:
if(dialog==null)
{
dialog=new Dialog(this);
dialog->setAttribute(QT::WA_DeleteOnClose,true);
}
dialog.show(),
當我第一次在MainWindow裡開啟關閉dialog都正常,當我第二次再執行開啟操作時候,就產生了記憶體讀取衝突的錯
誤,MainWindow也自動關閉了,求解,原因和方案,謝謝,本人新手,問題的原因是這樣:
dialog->setAttribute(QT::WA_DeleteOnClose,true); //這裡被delete之後並沒有置NULL,第二次進來直接show就可能出問題了
發現我們的程式碼查出的問題是一樣的,只不過dialog.show()寫在另外一個子函式,也就是說指標在一個地方被delete釋放了(它所指向的記憶體空間可以被其他程式申請使用了),沒有置為NULL,在另一個地方檢查非空後繼續呼叫,這個指標此時雖然不為空,但是它指向的空間可能被別的程式申請去了,意義已經改變。
總結:
使用setAttribute( Qt::WA_DeleteOnClose, true );需要保證在關閉以後不在使用這個指標,因為這個指標是沒有辦法自動設為NULL,會變為野指標。delete一個指標之後,只是回收指標指向位置的空間,而指標本身的值不變。你需要手工將其賦值為NULL。