從一次意外的堆棧溢出異常說開來 (一)
今天有一個朋友告訴我他的程序發生了StackOverFlowException
可是查來查去不知道為什么,就一段遞歸代碼幾個人閱讀過似乎都沒有問題
以下是簡化版的代碼 (真實的代碼復雜很多,不過大意如下)
static void Test(int i)
{
if (i > 20000)//或者其他退出條件
{
return;
}
Test(i + 1);
}
static void Main()
{
Test(0);
}
呵呵,大家能看出有什么問題么? 提示:邏輯上沒有任何問題,也別在找什么語法錯誤
看起來邏輯是:這段代碼沒有死循環,20000次就退出嘛,
可是在實際運行中會拋出StackOverFlowException異常,
其原因是由于遞CLR中默認堆棧大小是1M,
此程序不斷的遞歸,每一級遞歸的方法都被壓入了堆棧,當堆棧大小達到1M的時候,StackOverFlowException就拋出了
在我的機器上i運行到15918的時候拋出了堆棧溢出
大家可能覺得 要遞歸10000多次呢,看起來應該不會有什么問題吧
其實只要不小心,小幾百次的遞歸就會出異常。
稍后演示這種情況。。。
浙公網安備 33010602011771號