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