Stackoverflow异常和递归方法

时间:2014-11-01 11:35:24

标签: c# memory-management garbage-collection

为什么顶部的应用程序不会抛出堆栈溢出异常?什么是递归方法?我理解底部示例创建一个深度调用堆栈,因此它会抛出错误。但是第一个例子是我们在内存中使用相同的空间还是垃圾收集器帮助我们。

class ProgramErrorFree
{
    static void Main()
    {
       while(true)
        {
            Console.WriteLine(Guid.NewGuid());
        }
    }
}

class ProgramStackOverFlow
{
    static void Recursive(int value)
    {
        // Write call number and call this method again.
        // ... The stack will eventually overflow.
        Console.WriteLine(value);
        Recursive(++value);
    }

    static void Main()
    {
        // Begin the infinite recursion.
        Recursive(0);
    }
}

1 个答案:

答案 0 :(得分:4)

  

为什么顶部的应用程序不会抛出堆栈溢出异常?

你为什么期待它?来自MSDN: StackOverflowException Class

  

执行堆栈溢出时抛出的异常,因为它包含太多嵌套方法调用

你的堆栈永远不会超过两帧:

  • ProgramErrorFree.Main()
    • Guid.NewGuid()
    • Console.WriteLine()

而你的第二个程序堆栈帧不断堆叠:

  • ProgramStackOverFlow.Main()
    • ProgramStackOverFlow.Recursive()
      • ProgramStackOverFlow.Recursive()
        • ProgramStackOverFlow.Recursive()
          • ProgramStackOverFlow.Recursive()
            • ProgramStackOverFlow.Recursive()

依此类推,直到你的堆栈空间不足为止。

我认为你期望Guid.NewGuid()快速连续“溢出”堆栈,但这不是那么有效。请参阅Eric Lippert的博客The Stack Is An Implementation Detail, Part One以及有关堆栈的内容及其用途的更多信息。

另请参阅Running out of ValueType stack space了解如何在没有递归的情况下耗尽堆栈空间。