我知道,當爲您提供隱式構造函數時,您的類成員將從左到右和從上到下進行初始化。換句話說,按照他們聲明的順序。然後,當類對象超出範圍時,所有成員都以相反的順序被破壞。但是,如果我必須自己銷燬成員,我是否必須按照列出的順序來執行操作?例如:我是否必須按順序明確銷燬對象
struct Dog {};
struct Animal
{
Dog* dog1 = new Dog;
Dog* dog2 = new Dog;
~Animal()
{
delete dog2; // First delete dog2
delete dog1; // Then delete dog1
// Or do I?
}
};
我認爲所提供的析構函數是空的。因此,當我聽到類在超出範圍時會調用它的析構函數時,它不會在它自己的析構函數中執行此操作,而是在它之後使用編譯器單獨生成的代碼執行此操作。因此,例如:
struct Animal
{
Dog dog1;
// ~Animal(){}implicitly defined destructor here. dog1 isn't destroyed here
// But is destroyed here, or after, or something along those lines with separate code that the compiler generates?
};
感謝。
我明白了。我開始認爲反向破壞只對棧上的東西很重要,而不是堆?我錯了嗎?編輯:沒有等待,但可以在堆上創建類對象。哦,我很困惑。 – Zebrafish
@TitoneMaurice:取決於「重要」的含義。 –
@TitoneMaurice - 總是很重要,特別是如果成員是彼此相關的對象。你不想以錯誤的順序摧毀那些人。 – StoryTeller