在C#,C++和Java中导致堆栈溢出的最简单方法

Hos*_*rus -3 javascript c# c++ java

我正在看一个C#教程,遇到了StackOverflowException.

叙述者使用下面的代码片段给出了这样一个例外的简洁例子,

public class Employee
{
    private string _name;

    public string Name
    {
       get{ return Name; }
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在寻找C++和Java中这种类型的简单代码的一些示例,更具体地说是在javascript中可能导致Stack Overflow.

Nik*_*wal 13

这个解释是Java,C,C++语言的StackOverflowException背后的基本原因.

由于递归方法调用,Stackoverflow异常是由任何语言引起的.

假设您有一个调用自身的方法或无限递归循环的任何其他方法,那么它将导致Stacoverflowexception.这背后的原因是方法调用堆栈被填充,它将无法容纳任何其他方法调用.

方法调用堆栈看起来像这张图片.

在此输入图像描述

解释 - 假设Main方法有五个语句,第三个方法调用methodA,然后main语句的执行在statement3处暂停,MethosA将被加载到调用堆栈中.然后方法A调用methodB.所以methodB也被加载到堆栈中.

因此,以这种方式无限递归调用使调用堆栈得到填充.所以它不能再提供任何方法了.所以它抛出StackOverflowException.

  • 请注意,某些语言(特别是Scala)支持[尾部调用优化](http://stackoverflow.com/questions/310974/what-is-tail-call-optimization),因此在最简单的情况下不容易受到堆栈溢出的影响(以及其他人). (2认同)

Nil*_*lsH 5

在Java中:

public class Test {
    public static void main(String[] args) {
        main(args);
    }
}
Run Code Online (Sandbox Code Playgroud)

通常,任何不终止或迭代次数过多的递归函数都会导致此问题.

  • 不妨使代码缩小50%,直接从main调用main(args). (4认同)
  • 您应该接受来自@Nikhil的答案.这只是一个Java示例.Nikhils的回答总体上解释了堆栈溢出的概念. (2认同)