Bri*_*ian 20

由于没有人提到它:

throw new System.StackOverflowException();
Run Code Online (Sandbox Code Playgroud)

您可以在测试或进行故障注入时执行此操作.


Jus*_*eff 17

声明一个ENORMOUS数组作为局部变量.

  • 编译器无法捕获它,除非编译器能够分析预计运行时堆栈使用的代码,这可能非常棘手. (2认同)

小智 12

如果调用足够的方法,则可能随时发生堆栈溢出.虽然,如果在不使用递归的情况下出现堆栈溢出错误,您可能需要重新考虑如何执行操作.递归就这么容易,因为在无限循环中,你会调用大量的方法.


Rem*_*anu 7

以下内容适用于Windows,但大多数操作系统以类似的方式实现此功能.

简短的回答是:如果你触摸最后一个警卫页面,它会抛出.

当您的应用程序触及堆栈的底部页面时会引发EXCEPTION_STACK_OVERFLOW(C00000FD)类型的异常,该页面标记为PAGE_GUARD保护标志,并且没有空间来增加堆栈(再提交一页),请参阅如何捕获堆栈在Visual C++应用程序中溢出.
发生这种情况的典型情况是堆栈由于堆栈上的许多功能帧而增长(即失控递归),因为帧数较少但帧尺寸非常大(具有非常大的局部范围的函数)对象)或通过从堆栈中显式分配_alloca.
引起异常的另一种方法是简单地有意触摸保护页面,例如.通过取消引用指向该页面的指针.这可能由于变量初始化错误而发生.

如果输入导致非常深的嵌套级别,则可以在有效的执行路径上发生堆栈溢出.例如,当您在SQL Server中的IN或NOT IN子句中运行包含大量参数的查询时,请参阅堆栈溢出.