近日,同時採取集中於面向對象編程的入門單位,我被介紹到C#中的垃圾收集器,而且它的作用是「清理」那些沒有對象更長時間被引用。然後我介紹了析構函數,以及在對象被刪除之前如何調用它們。對象實例化
當然,我想到了,但我從來沒有想過要問講師這件事;如果您在同一個類的析構函數中創建一個類的實例,會發生什麼?
C#示例
class Person{
~Person(){
Person p = new Person();
Console.WriteLine("Person destroyed");
}
}
class Program{
static void Main(string[] args){
Person p = new Person();
}
}
我想從一個更理論的角度接近這一點,所以我不願意(在此階段)來嘗試它,因爲我可能會看不明白,但我有一些理論。此外,我現在不在普通計算機上;)
- Person。〜Person()將會遞歸,因爲每次創建新Person時,都會調用它的析構函數並創建一個新的無限的人,或直到某種內存相關的異常發生。隨後,主將永不終止。
- 編譯器會抱怨(無論如何,將這個選項添加到每個場景似乎都是一個好主意)。
- 不知怎的,某種「析構函數跳過」會發生。即。對象銷燬不會被順序調用,因此構造函數也不會。
現在的類似相關問題。如果垃圾收集器的作用是刪除不再被引用/需要的對象,那麼在沒有垃圾收集器的環境中如何處理像上面這樣的情況 - 比如C++?
我很想知道這個簡單程序的執行過程是如何停止的?它顯然會開始鏈接終結器並輸出到控制檯。運行時如何殺死這個進程(正如我所知,正常的終止會運行終結器)。 – InBetween
@InBetween - 如果是異常終止,則沒有問題。在合作關機中,如果.Net運行時發現應用程序沒有彈球,它將最終停止處理終結器並釋放所有內容。終結者對你的計劃同樣重要。使用更現代的Windows操作系統,一旦進程關閉,資源也將被釋放。 –