2010-03-03 62 views
3

我有一個Qt應用程序,它使用QPointers調出新的UI對話框(Widgets)。主應用程序可以有許多與不同數據加載的相同小部件。我遇到的問題是刪除並釋放每個小部件的內存。如果我監視程序的RAM使用情況,每次單擊按鈕打開其中一個新窗口小部件時,它會增加內存,並且當我關閉窗口小部件時,它似乎沒有釋放內存。我試過使用deleteLater和其他解決方案,但不斷在程序中崩潰。QPointer和刪除對象

一些示例代碼是在這裏:

QPointer<ListReservations> listResWindow = new ListReservations(resID); 
listResWindow->setNum(numpeople); 
listResWindow->show(); 

這將調用「ListReservations」爲QDialog(非模態),這是宣佈部件。在那個對話框中,我有一個按鈕來關閉調用QWidget::close()插槽的窗口。

我想這個問題是怎麼做我的主程序(具有QPointer)知道什麼時候,關閉對話框,然後釋放對話框,(如果可能)刪除指針,以節省更多的內存...

我以爲你可能能夠對QPointer對象做一個QConnect(),但我似乎無法找到任何允許傳遞指針的信號或插槽,更不用說在對話框確實關閉並準備就緒後發送信號刪除。

也許我需要某種功能的主程序,需要一個通用指針對象,然後有QDialog的調用之前調用它自己的親密插槽?在那個函數中,它會自動被銷燬?僅僅拋出,我試過實現,但在失敗的想法....

我不認爲我可以在其他地方重複使用相同的指針,因爲從理論上講,你可以有多個ListReservations窗口同時開啓。

回答

3

請確保您設置的Qt::WA_DeleteOnClose屬性標誌使用QWidget::setAttribute()您的對話框。這應該確保該對話框在關閉時被正確銷燬。有關更多詳細信息,請參閱Qt documentation

假設存儲器現在被適當地釋放,指針應無效本身,從Qt documentation

甲把守指針,QPointer, 表現得像一個普通的C++指針T *, 不同之處在於它是自動設置爲0 當被引用的對象是 銷燬(不像普通的C++指針,其中 成爲 這種情況下「懸空指針」)

+1

你關閉時刪除的第一條建議就是點亮。但是,當指向的對象被刪除時,QPointer對象將被自動設置爲NULL,所以不需要onDialogClosed插槽(我可以看到)。 – 2010-03-03 17:28:41

+0

我以前從未使用過'QPointer',並假設它沒有這種行爲,謝謝你的信息。我會更新答案。 – 2010-03-03 17:35:27

+0

我還應該補充一點,在將QPointer用於不同線程所擁有的對象時,存在潛在的競爭條件。在這種情況下,可以在QPointer對象未被設置爲0的情況下刪除對象。 – 2010-03-04 19:15:52