请定义堆栈溢出异常--c#

请定义堆栈溢出异常--c#,c#,function,methods,compiler-errors,stack-overflow,C#,Function,Methods,Compiler Errors,Stack Overflow,我不确定什么是堆栈溢出异常。当我以另一种形式调用一个方法时,出现了这个错误 A在有太多方法相互调用时发生 每当您的代码调用函数时,运行库都会将一个条目推送到调用堆栈中,标记您调用该函数时所处的位置。当函数完成时,运行时从堆栈中弹出ntry并返回 堆栈满时会发生堆栈溢出。堆栈溢出是指堆栈空间不足时。堆栈空间通常由方法调用消耗,其中参数值被推送到堆栈上(当方法返回时,参数值从堆栈中弹出/移除)。出现堆栈溢出的最常见情况是当您有某种递归(一种调用自身的方法)时。在每次方法调用中,您都会消耗更多的堆栈空

我不确定什么是堆栈溢出异常。当我以另一种形式调用一个方法时,出现了这个错误

A在有太多方法相互调用时发生

每当您的代码调用函数时,运行库都会将一个条目推送到调用堆栈中,标记您调用该函数时所处的位置。当函数完成时,运行时从堆栈中弹出ntry并返回


堆栈满时会发生堆栈溢出。

堆栈溢出是指堆栈空间不足时。堆栈空间通常由方法调用消耗,其中参数值被推送到堆栈上(当方法返回时,参数值从堆栈中弹出/移除)。出现堆栈溢出的最常见情况是当您有某种递归(一种调用自身的方法)时。在每次方法调用中,您都会消耗更多的堆栈空间,直到用完为止——也就是说,当您得到堆栈溢出时。

有时程序会出现错误行为。程序员通过实现一些逻辑并测试其是否正确工作来编写程序。但是,如果程序员在逻辑上犯了错误,坏事情就会发生

可能程序出错的最常见方式之一是使用无限循环。以尝试将前n个整数相加的示例程序为例:

static int Sum(int n)
{
    int sum = 0;
    int i = 1;
    while (i <= n)
        sum += i;
    return sum;
}
这种方法也是有缺陷的。它也有一个“无限循环”,因为我们忘记了包含终止条件。当我们运行它时会发生什么

进程因StackOverflowException而终止

在C#中,每次调用一个方法时,都会消耗一点称为堆栈的资源。堆栈允许程序跟踪谁调用了谁,以便当方法返回时,它返回到正确的位置。方法参数和局部变量也会占用堆栈空间。当方法结束并返回时,它们会释放所使用的堆栈空间

问题是堆栈使用内存,因此它不像时间那样是无限的资源

因此,程序可以通过两种主要方式生成
StackOverflowException

  • 调用永远不会返回的方法的方法的无限循环
  • 一系列太多的递归调用级别,最终将结束,但堆栈首先耗尽
  • 第一个问题由上面的第二种方法演示。但是,即使我们修正了该方法来添加终止条件,虽然它对较小的数字有效,但在生成足够大的n值的和之前,它最终将失败

    大多数garden variety
    StackOverflowException
    s属于第一种类型,但如果在方法中不小心使用递归,也可能会遇到第二种问题

    调试
    StackOverflowException
    时,调用堆栈通常如下所示:

    ...
    Program.RecursiveSum(int n = -7770) Line 26 + 0xf bytes C#
    Program.RecursiveSum(int n = -7769) Line 26 + 0xf bytes C#
    Program.RecursiveSum(int n = -7768) Line 26 + 0xf bytes C#
    Program.RecursiveSum(int n = -7767) Line 26 + 0xf bytes C#
    Program.RecursiveSum(int n = -7766) Line 26 + 0xf bytes C#
    The maximum number of stack frames supported by Visual Studio has been exceeded.    
    

    或者有时
    A
    调用
    B
    调用
    C
    ,然后再次调用
    A
    ,等等。您只需找到循环,在中设置断点,诊断发生了什么。

    如果您发布一些代码,效果会更好——这样我们就可以完成我们在这里真正要做的事情:帮助您修复异常,当然,如果C#有一个发出尾部调用的编译器,在本例中可能不会出现堆栈溢出;哦。。。这真的很有帮助!谢谢
    ...
    Program.RecursiveSum(int n = -7770) Line 26 + 0xf bytes C#
    Program.RecursiveSum(int n = -7769) Line 26 + 0xf bytes C#
    Program.RecursiveSum(int n = -7768) Line 26 + 0xf bytes C#
    Program.RecursiveSum(int n = -7767) Line 26 + 0xf bytes C#
    Program.RecursiveSum(int n = -7766) Line 26 + 0xf bytes C#
    The maximum number of stack frames supported by Visual Studio has been exceeded.