0
考慮在堆上實例化的任何QObject。如果它不是父親,並且沒有任何電話會刪除它,它是否曾因任何原因輸入QObjectPrivate::deleteChildren()
?QObjectPrivate :: deleteChildren是否曾經在堆對象上調用,如果它不是父對象?
考慮在堆上實例化的任何QObject。如果它不是父親,並且沒有任何電話會刪除它,它是否曾因任何原因輸入QObjectPrivate::deleteChildren()
?QObjectPrivate :: deleteChildren是否曾經在堆對象上調用,如果它不是父對象?
但是,當然,刪除與破壞是正交的。如果這個對象被破壞,它當然會刪除它的子女。某些東西可能會在對象上調用析構函數而不從堆中釋放它。那就是你的代碼,或者編譯器生成的代碼,順便說一句,Qt中沒有「魔術」來隨機破壞QObject
s。
如果對象的生命週期是由一個合適的智能指針管理(比如QScopedPointer
,QSharedPointer
,std::unique_ptr
,或std::shared_ptr
),則智能指針會破壞對象,無需你明確地做任何事情。
是的,我意識到Qt沒有什麼魔力,它只是一個明確定義的框架。我已經看到堆棧跟蹤開始於一個對象的deleteChildren中,這個對象既不是父對象也沒有對它的調用。這讓我感到困惑,因爲執行可能是如何進入deleteChildren的。我知道這不應該發生,除非該對象被明確地賦予一個父對象或該對象被手動刪除(在它是一個堆對象的情況下)。 –
如果這樣的對象的實例被創建爲自動變量或靜態變量,那麼編譯器將會破壞它。同樣,這不是關於刪除,而是關於*破壞*。兩**非常**不同的東西。 –
刪除恰巧調用虛擬析構函數。這是一個不錯的巧合:)但是這個工作是在析構函數中完成的,所以你應該關注什麼可能會破壞你的對象而不是刪除它。 –