- 堆溢出:不断的new 一个对象,一直创建新的对象,
-
栈溢出:死循环或者是递归太深,递归的原因,可能太大,也可能没有终止。
- 在一次函数调用中,栈中将被依次压入:参数,返回地址,EBP。如果函数有局部变量,接下来,就在栈中开辟相应的空间以构造变量。
- 举例如下:
-
那么堆栈是什么?如果计算机是一个白领的话,那么堆栈就是他的办公桌。为了完成老板(程序)交代的工作,这个白领需要从书架或者柜子里拿出资料出来核对处理。所谓的堆栈溢出就是为了解决一个任务,所需要的资料或者所处理的临时数据太多了把桌子堆满了,然后这个白领就罢工了。。。。
但一般情况下,这个办公桌是足够大的,所以堆栈溢出一般都是老板(程序)交代的工作出现了问题。最常见的就是无限递归,例如为了解决问题A,必先解决问题B,要解决问题B,必须解决问题A,这时候这个这个白领不断的写笔记解决问题A,解决到一半又要写笔记解决问题B,还没弄完又要写笔记解决问题A,如此反复,很快桌子就被笔记堆满了(溢出了)。
-
通常「堆栈溢出」是指「调用堆栈(call stack)的溢出」。要通俗地解释调用堆栈可能比较困难,因为它涉及许多其他计算机架构的知识。而这个答案只是简单地解释堆栈这种数据结构的特点──先进后出/后进先出。溢出是指这个数据结构满溢,不能存放更多数据。其他的数据结构也会遇到这个情况。即使数据结构并非固定容量,而是可扩展的,在有限的内存空间下仍是有满溢的机会。
另外,很多时候,「调用堆栈溢出」的出现是与递归(recursion)相关的。我们可以把一些递归的实现改为迭代(iteration),但有时还是必须有一个自定义的堆栈数据结构,例如对树的深度优先搜索(Depth-First Search, DFS)。自定义的堆栈也是有溢出的可能。
所以,虽然堆栈溢出常指调用堆栈溢出,但本质上也只是一种数据结构的满溢情况。