2013-10-28 11 views

回答

0

但是,當然,刪除與破壞是正交的。如果這個對象被破壞,它當然會刪除它的子女。某些東西可能會在對象上調用析構函數而不從堆中釋放它。那就是你的代碼,或者編譯器生成的代碼,順便說一句,Qt中沒有「魔術」來隨機破壞QObject s。

如果對象的生命週期是由一個合適的智能指針管理(比如QScopedPointerQSharedPointerstd::unique_ptr,或std::shared_ptr),則智能指針會破壞對象,無需你明確地做任何事情。

+0

是的,我意識到Qt沒有什麼魔力,它只是一個明確定義的框架。我已經看到堆棧跟蹤開始於一個對象的deleteChildren中,這個對象既不是父對象也沒有對它的調用。這讓我感到困惑,因爲執行可能是如何進入deleteChildren的。我知道這不應該發生,除非該對象被明確地賦予一個父對象或該對象被手動刪除(在它是一個堆對象的情況下)。 –

+0

如果這樣的對象的實例被創建爲自動變量或靜態變量,那麼編譯器將會破壞它。同樣,這不是關於刪除,而是關於*破壞*。兩**非常**不同的東西。 –

+0

刪除恰巧調用虛擬析構函數。這是一個不錯的巧合:)但是這個工作是在析構函數中完成的,所以你應該關注什麼可能會破壞你的對象而不是刪除它。 –

相關問題