请定义堆栈溢出异常--c#
我不确定什么是堆栈溢出异常。当我以另一种形式调用一个方法时,出现了这个错误 A在有太多方法相互调用时发生 每当您的代码调用函数时,运行库都会将一个条目推送到调用堆栈中,标记您调用该函数时所处的位置。当函数完成时,运行时从堆栈中弹出ntry并返回请定义堆栈溢出异常--c#,c#,function,methods,compiler-errors,stack-overflow,C#,Function,Methods,Compiler Errors,Stack Overflow,我不确定什么是堆栈溢出异常。当我以另一种形式调用一个方法时,出现了这个错误 A在有太多方法相互调用时发生 每当您的代码调用函数时,运行库都会将一个条目推送到调用堆栈中,标记您调用该函数时所处的位置。当函数完成时,运行时从堆栈中弹出ntry并返回 堆栈满时会发生堆栈溢出。堆栈溢出是指堆栈空间不足时。堆栈空间通常由方法调用消耗,其中参数值被推送到堆栈上(当方法返回时,参数值从堆栈中弹出/移除)。出现堆栈溢出的最常见情况是当您有某种递归(一种调用自身的方法)时。在每次方法调用中,您都会消耗更多的堆栈空
堆栈满时会发生堆栈溢出。堆栈溢出是指堆栈空间不足时。堆栈空间通常由方法调用消耗,其中参数值被推送到堆栈上(当方法返回时,参数值从堆栈中弹出/移除)。出现堆栈溢出的最常见情况是当您有某种递归(一种调用自身的方法)时。在每次方法调用中,您都会消耗更多的堆栈空间,直到用完为止——也就是说,当您得到堆栈溢出时。有时程序会出现错误行为。程序员通过实现一些逻辑并测试其是否正确工作来编写程序。但是,如果程序员在逻辑上犯了错误,坏事情就会发生 可能程序出错的最常见方式之一是使用无限循环。以尝试将前n个整数相加的示例程序为例:
static int Sum(int n)
{
int sum = 0;
int i = 1;
while (i <= n)
sum += i;
return sum;
}
这种方法也是有缺陷的。它也有一个“无限循环”,因为我们忘记了包含终止条件。当我们运行它时会发生什么
进程因StackOverflowException而终止
在C#中,每次调用一个方法时,都会消耗一点称为堆栈的资源。堆栈允许程序跟踪谁调用了谁,以便当方法返回时,它返回到正确的位置。方法参数和局部变量也会占用堆栈空间。当方法结束并返回时,它们会释放所使用的堆栈空间
问题是堆栈使用内存,因此它不像时间那样是无限的资源
因此,程序可以通过两种主要方式生成StackOverflowException
:
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.