从一次意外的堆栈溢出异常说开来 (一)
今天有一个朋友告诉我他的程序发生了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多次呢,看起来应该不会有什么问题吧
其实只要不小心,小几百次的递归就会出异常。
稍后演示这种情况。。。