2013-10-11 100 views
1

示例代碼:爲什麼叫StackOverflowException?爲什麼不HeapOverSizedException?

Static void main(string[] args) { Class1 c1 = new Class1(); } 

Class1 { Class1() { Class2 c2 = new Class2(); } } 

Class2 { Class2() { Class1 c1 = new Class1(); } } 

上面代碼拋出StackOverFlowException。這裏我們遞歸創建Class1 & Class2對象。對象存儲在Heap中,那麼爲什麼它不投擲HeapOversizedExceptionsomeotherException與堆相關?

+5

因爲你沒有用完堆(內存),所以你正在用遞歸方式來堆棧。 –

+4

此外,*有*「堆超大異常」。它被稱爲['OutOfMemoryException'](http://msdn.microsoft.com/en-us/library/system.outofmemoryexception.aspx)。 – Jon

+0

這將被定義爲'OutOfMemoryException'這是引用線程執行堆棧的堆棧 –

回答

8

無限遞歸總是導致StackOverflowException。這不是因爲對象分配,而是因爲對方法的調用必須記住堆棧上調用者的地址,並且無限地使堆棧溢出。

Wikipedia對該過程有相當正式的描述。

+1

要添加,每次調用一個函數(在本例中爲構造函數)時,堆棧必須記住返回的位置(之後該函數被調用)。它有數量有限的地方來存儲這個返回信息。 –

3

StackOverflowException - 堆棧將用於存儲當前地址 並跳轉到功能代碼執行。然後它將被釋放或當函數返回時彈出 。由於你的電話永遠不會結束或返回,因此連續堆棧已填充地址並將其填充。