当前位置: 首页 > article >正文

stack overflow异常分析及解决办法

  stack overflow异常是程序中常常会碰到的,究其原因,是进程空间中的栈不够用。windows默认栈大小是1M,使用的栈超过了这个范围就会包stack overflow异常。

  产生原因可以归结为两类:

  1. 错误。程序中出现了不该出现的死循环,例如递归函数没有出口,这种情况,不管栈空间有多大,早晚要溢出的。这类错误,通过debug,比较容易查找。举个例子:
long func(int n)
{return n*func(n-1);
}


这就是个没有出口的递归函数,只要该函数被调用,必然在某一次执行该函数时会引起栈溢出,具体是第多少次调用不好说。但是这个错误只要修改了,就可以纠正:

long func(int n)
{if(n==1) return 1;return n*func(n-1);
}

      2. 确实栈不够使用。保存到栈上的主要内容是:局部变量和函数调用的函数环境(包括函数参数等)。首先,对于局部变量,程序员应该比较清楚,例如:

char buff[1024*1024]

            buff大小为1M,如果你的栈默认大小也是1M,这时就会发生栈溢出(因为其他东西还要占掉少量栈空间,局部变量能用的空间肯定小于1M),在这种情况下,程序执行到main函数之前,就会跳出stack overflow异常。

另一种情况函数调用深度太深,这种情况一般发生在递归调用中,比如说一个求斐波那契数列的递归函数:

long func(long n)
{if(n<=0) return -1;if(n==1) return 1;if(n==2) return 1;return func(n-1) + func(n-2);
}


如果你调用func(1024*1024); 肯定就要栈溢出。

当栈不够使用时,一种办法是修改程序,看程序有没有可以优化的地方,例如,使用动态规划来代替递归算法等。另一种方法是增大栈空间,在vs2010中设置,项目->属性->连接器->系统->栈保留空间,如图。

 

总结,栈一不会使用得很大,主要还是要注意递归调用时,引起的栈溢出,多数情况可以通过算法优化来解决。递归深度不建议太深。

http://www.lryc.cn/news/2417691.html

相关文章:

  • Hdfs(五)DataNode
  • PNG文件格式详解
  • phoenix 使用技巧
  • Lombok常用注解总结
  • (P33-P35)lambda表达式语法,lambda表达式注意事项,lambda表达式本质
  • mariaDB(mysql数据库)-安装配置和使用
  • 理解:QPS、TPS、RT、吞吐量
  • MinGW安装教程
  • Java中 static 关键字相关的用法
  • ADB 安装 + 打驱动全教程
  • 不同的存储库(Repository)模式实现
  • 开源项目 `signature` 使用教程
  • GCC详解-Binutils工具之strip
  • 消息传递机制之Handler使用总结
  • 一分钟快速过安卓四大组件——Activity篇
  • 2024年最新GIMP(Linux下的Photoshop)-KOS安装教程_linux photoshop
  • 19 张图概览 Spring Cloud(收藏夹吃亏系列)
  • linux后台运行nohup | 进程查看、终止 | linux基础命令记录
  • Mybatis-Plus理解及使用
  • 前端进阶之路——域名(domain)
  • win11下配置visual studio 2022+PCL1.13.0
  • 50个常用的 Numpy 函数详解!
  • kali简介
  • Java | final关键字快速上手【通俗易懂,看这篇就够了】
  • UUID介绍与生成方法
  • fps游戏战斗相关漫谈(五)
  • 安卓工程师必须了解的Gradle知识
  • ASCII码对照表(包括十六进制、十进制和字符)
  • 如何使用Chat GPT
  • 适合小白入门!Sqlite数据库学习(附操作过程截图)