2015-12-27 64 views
1

我使用Qt構建了一個應用程序。它包括一些屏幕,其中一些是動態分配的。 我正在考慮是否要在onBackButton()上動態分配對象delete,或者只在製造商的析構函數中動態分配對象。在後退按鈕或關閉應用程序時調用析構函數?

事情是這樣的:

如果他們onBackButton(正在刪除),這將節省內存,因爲只要沒有顯示屏幕,內存不會被使用。但是,這意味着如果我們在這些屏幕之一中關閉應用程序,內存將不會被釋放。另一方面,如果我們在製造商的析構函數上刪除它們,當應用程序存在時,內存將被重新分配。但即使我們不在該屏幕中,仍然會使用內存(如果我們進入了這樣一個屏幕,然後再按下,內存仍將被使用)。

當然,我們不能在delete兩個位置。這會拋出異常。

我去了第一個選項,因爲「關閉(存在)」應用程序的唯一方法是通過物理按下設備上的電源按鈕 - 這將關閉設備。 所以沒有傷害 - 下次我們打開設備一切都會好的。

我的方法是否正確或有什麼更好的辦法?

回答

1

對於QObject(和子類),您可能應該使用(即調用)deleteLater插槽。

對象將被刪除時,控制返回到事件循環

+1

我想他是在談論在哪裏調用delete或deleteLater()函數。所以他如何刪除對象並沒有什麼區別。由於下一次最有可能發生在當前事件循環之後。 –

3

好吧,如果你的應用是設備上運行的唯一的事情,那麼你所說的,在應用程序關閉設備將關閉下來,所以沒問題。

但作爲一個更好的做法,我認爲你可以使用Qt的內存清理系統。它的工作原理是,QObject的任何實例都會刪除其自己刪除的所有子QObject。因此,您只需要設置窗口的父窗體並將此父級層次結構的頂部設置爲QApp實例。這種應用程序相當每個人都會被正確銷燬。

另外,只要您將指針設置爲nullptr,您當然可以在多個位置刪除一個對象,以便下一次刪除不會引發任何異常。

但是更好的方法是使用QPointer來保存指針,那麼每當刪除該對象時它就會爲空。

另一種方法可能是使用新的C++ 11 std::shared_ptr,但你必須發佈一些代碼來更好地說明你的情況。

相關問題