【发布时间】:2018-04-06 07:07:17
【问题描述】:
你能告诉我为什么下面的代码会抛出堆栈溢出错误吗?
class Program
{
static void Main()
{
Program.Main();
}
}
为什么调用 Main() 方法会导致堆栈内存被填满并最终引发堆栈溢出错误?当我像这样运行无限循环时,这永远不会发生-
class Program
{
static void Main()
{
// Program.Main();
bool abcd = true;
while (abcd)
Console.WriteLine("Running");
}
}
请让我知道这是否与类的静态成员的内存管理有关或与之相关。我在互联网上寻找答案,但找不到合适的答案。
【问题讨论】:
-
无限递归调用——堆积堆栈
-
在第一个你从来没有调用过 program.main,所以数十亿次迭代之后,你仍然进入 main 并再次进入 main.. while 循环是一个 while 循环,它没有向堆栈添加另一个级别。把它想象成爬楼梯。第一个你在永无止境的跑步机上,第二个你进去站在第一步聊天。
-
因为你在调用
Main,在里面你在调用Main,在里面你在调用Main,在里面......方法调用越来越深,形成一个堆栈,其大小是有限的。一旦超过限制,它就会爆炸。 -
无限循环与递归。虽然它们可能看起来相似,但它们的作用并不完全相同。递归会消耗堆栈,而无限循环则不会。作为一般规则,永远不要在没有退出条件/检查的情况下进行递归。
标签: c# .net static stack-overflow