堆栈溢出的产生是由于过多的函数调用,导致调用堆栈无法容纳这些调用的返回地址,一般在递归中产生。堆栈溢出很可能由无限递归(Infinite recursion)产生,但也可能仅仅是过多的堆栈层级。下面小编给大家介绍一下“堆栈溢出一般是由什么原因导致的 堆栈溢出怎么解决”
1.堆栈溢出一般是由什么原因导致的
递归过程的局部变量过多、递归深度过大,是造成系统栈溢出的原因,特别是递归列循环时肯定会发生系统栈溢出。
递归堆栈溢出的解决方案是尾部递归优化。事实上,尾部递归和循环具有相同的效果,所以可以把循环看作是一个特殊的尾部递归函数。
尾部递归,当函数返回时调用自身,并且返回语句不能包含表达式。通过这种方式,编译器或解释器可以优化尾部递归,这样递归本身无论被调用多少次,都只占用一个堆栈帧,而不会出现堆栈溢出。
(图片来源于互联网)
2.堆栈溢出怎么解决
方法一 :
不静态分配,用new动态创建,从堆中分配的,堆的空间足够大。
不过记得写析构函数,delete你申请的堆空间。其实这样也挺方便,类结束的时候会自动调用析构函数释放空间。养成“不在栈上定义大数组/大对象”的好习惯很重要,否则再大的栈也会被撑爆的。
当然,如果你不喜欢new,delete的话,还是静态分配(毕竟静态分配有很多好处),那么可以通过改变默认栈空间来解决。
方法二:
打开自己常用的浏览器,这个方法适用于所有的浏览器。
找到菜单栏,在菜单栏上面存在一个"工具"选项,单击工具这个按钮。
在"工具"这个选项下面有个"Internet选项",点击这个功能选项。就可以进入"Internet选项"界面。
主要的操作就在"Internet选项"里面,当你点击"Internet选项"的时候就会弹出一个窗口。
在"Internet选项"窗口上方有个"高级"按钮,点击这个按钮,然后在"设置"下一级存在一个功能"禁用脚本调试",这个功能项在默认状态下是勾选起的,现在我们要取消勾选这个功能项。