什么是堆栈溢出?(What is a stack overflow?)

2019-06-25 14:11发布

什么是一个堆栈溢出错误? 什么类型的程序/编程语言是可能发生吗? 它是不可能在Web应用程序代码出现?

Answer 1:

从维基百科 :

在软件上,当过多的内存调用堆栈上使用时会发生堆栈溢出。 在许多编程语言,调用堆栈包含内存量有限,通常在节目的开始来确定。

堆栈是一种数据结构,保持程序的子程序应该返回控制,当他们执行完毕的点的记录。 返回地址在压入堆栈的子程序被调用,当子程序完成其执行的返回地址从堆栈中拉出 。 如果有很多子程序并且在堆栈中的堆栈溢出没有发生空间。

此外,在堆栈用于存储局部变量,所以如果一个局部变量太大,更有可能堆栈没有空间来存放它,如果这是一个堆栈溢出发生过的情况。

维基百科包括一个漂亮的图描绘堆栈时DrawLine子程序从另一个名为子程序称为DrawSquare ,我希望这幅画有助于更好地了解堆栈结构。

有一个堆栈溢出的两个主要原因: 深递归函数过大的堆栈变量 。 由于这些都是常见的术语在几乎所有的编程语言堆栈溢出可以除了语言的复杂情况发生。

Guffa贡献:堆栈没有任何与垃圾收集。 现代的应用程序具有更大的栈,这使得它稍微不太可能得到一个堆栈溢出,但除此之外,没有任何区别。



Answer 2:

堆栈包含许多堆叠的帧,并存储在存储器中。 每一个函数被调用时,一个新的堆栈帧被添加到堆栈。 栈帧包含要传递给函数调用的参数和返回地址,这样,当调用的函数已经完成了CPU知道在哪里可以返回,因此它可以继续执行调用函数。 堆栈帧还可以包含存储器以由函数的局部变量被用于被调用。

在这个例子中,main函数调用WriteCustomerDetails和调用PrintToConsole写出来的WriteCustomerDetails功能抬头数据的各个位:

“=======堆栈的顶部=====================”
功能:PrintToConsole
精氨酸:约翰·史密斯,34合欢大道,年龄23
“------------------------------------------------- ----------”
功能:WriteCustomerDetails
精氨酸:约翰·史密斯
“------------------------------------------------- ----------”
功能:主要
“堆的底部====== ===================”

如果栈足够的空间并没有预留发生堆栈溢出。 一般的叠层坐在的存储器中的一个大的连续的块,所以不被划分成块,这意味着需要为它的一个大一块内存,而这使得它很难用于运行时,试图成长为堆栈保留的空间如果它填满。

当功能被意外地写一个自称经常发生堆栈溢出。 有时候,这是确定的功能本身,只要有一个“如果”或一些停在某个点上调用函数调用的条件。 这就是所谓的递归函数。 但是,如果没有停止和功能保持自称,或者两个或多个功能一直在呼唤对方,那么很快就会吃光所有的堆内存最多。 还有的没有离开的时候,你会得到一个堆栈溢出和程序崩溃。

这是可能做到这一点在任何程序中,他们不一定是复杂的,它可以在代码运行的网站发生。 而且,它可以在脚本语言发生了。



Answer 3:

当你使用太多堆栈空间堆栈溢出发生。 一般有两种情况,当发生这种情况:

第一种是当你在代码中有一个错误,导致一个递归循环没有退出。 例如,一个财产本身阅读:

public int Length {
   get {
      return Length;
   }
}

第二个是当你有一个递归循环太深。 随着堆栈空间有限,你只能窝的算法的若干倍。 如果你的算法嵌套太深,使得它运行的堆栈空间存在之前,你会得到一个堆栈溢出。 例:

public bool Odd(int value) {
   if (value == 0) {
      return false;
   } else {
      return !Odd(value - 1);
   }
}

如果调用此方法具有过大的值,它会窝太深而导致堆栈溢出。



Answer 4:

从维基百科职高的,:

在软件上,当过多的内存调用堆栈上使用时会发生堆栈溢出。 在许多编程语言,调用堆栈包含内存量有限,通常在节目的开始来确定。 调用堆栈的大小取决于许多因素,包括编程语言,计算机体系结构,多线程,和数量的可用内存。 当太多的内存用在调用栈中的堆栈据说溢出; 典型地导致程序崩溃。 1该类软件的bug通常由两种类型之一的编程错误引起的



Answer 5:

当您使用堆栈(杜...)并有一个内存分配/读取问题发生堆栈溢出。 在“网络课程”,因为你把它(我假设你正在谈论HTML,PHP,JS),要么你不使用栈或使用不允许以防止这些问题的低级存储器控制语言。



文章来源: What is a stack overflow?