堆栈溢出

 

1、 堆栈尺寸设置过小
由堆栈溢出的定义便可知,堆栈尺寸设置过小时,其能储存的内容过小,容易发生溢出。  
2、递归层次太深或函数调用层次过深导致堆栈溢出
调用函数时,系统将为调用者构造一个由参数表返回地址组成的活动记录,并将其押入到由系统提供的运行时刻栈的栈顶,然后将程序的控制权转移到被调函数。若被调函数有局部变量,则在运行时刻,在栈的栈顶也要为其分配相应的空间,因此,活动记录和这些局部变量形成了一个可供被调函数使用的活动结构。被调函数执行完毕时,系统将运行时刻栈的栈顶的活动结构退栈,并根据退栈的活动结构中所保存的返回地址将程序的控制权转移给调用者继续执行。由此可见,当递归层次太深时或者函数调用层次过深时会产生大量的活动记录和局部变量,当超过栈的空间长度时,即发生溢出。 
例如C/C++语言中的无限递归.
 
3、动态申请空间使用之后没有释放(堆溢出)
如果是C语言,由于没有垃圾资源自动回收机制,因此,需要程序主动释放已经不再使用的动态地址空间,如果不释放,程序结束后该部分空间依然存在,还可以继续访问,也就是说这部分依然占据着堆空间,剩余的堆空间减少,就可能造成堆区溢出。 而如果是Java语言则因为有专门的垃圾回收器回收则不会有此问题。
 
因为代码块内的变量、结构等是存放在自由存储区,自由存储区内存使用栈来进行内存管理。当函数内部的数组过大时,有可能导致栈溢出。解决办法是使用new来为数组、结构等分配内存,此时内存分配在动态存储区,动态存储区的内存使用堆来进行内存管理,不会导致栈溢出。
posted @ 2020-12-15 20:01  zeroPatrick  阅读(783)  评论(0编辑  收藏  举报