1. 程式人生 > >Qt之Qt::WA_DeleteOnClose詳解

Qt之Qt::WA_DeleteOnClose詳解

當用戶關閉一個主視窗時,預設行為是隱藏它,所以它還會保留在記憶體中。對於數量大的主視窗會造成一定的問題。解決辦法是在建構函式中對Qt::WA_DeleteOnClose的屬性進行設定:     MainMindow::MainWindow( ) {         . . .         setAttribute(Qt::WA_DeleteOnClose);         . . .
} 這樣做就會告訴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。