[转]C++ 堆栈溢出的原因以及可行的解决方法
栈溢出(stackoverflow)的原因及解决办法
大家都知道,Windows程序的内存机制大概是这样的:全局变量(局部的静态变量本质也属于此范围)存储于堆内存,该段内存较大,一般不会溢出;
函数地址、函数参数、局部变量等信息存储于栈内存,VC++6中栈内存默认大小为1M,对于当前日益扩大的程序规模而言,稍有不慎就可能出问题(动态申请的内存即new出来的内存不在栈中),即如果函数这样写:
void test_stack_overflow()
{
char *pdata = new[2 * 1024 * 1024];
delete[]pdata;
}
是不会出现这个错误的,而这样写则不行:
void test_stack_overflow()
{
char chdata[2 * 1024 * 1024];
}
大多数情况下都会出现内存溢出的错误,不信在VC++6中随便做个程序,调用一下这个函数试式。
出现栈内存溢出的常见原因有2个:
1>函数调用层次过深,每调用一次,函数的参数、局部变量等信息就压一次栈。
2>局部静态变量体积太大
第一种情况不太常见,因为很多情况下我们都用其他方法来代替递归调用(反正我是这么做的),所以只要不出现无限制的调用都应该是没有问题的,起码深度几十层我想是没问题的,这个我没试过但我想没有谁会把调用深度作那么多。检查是否是此原因的方法为,在引起溢出的那个函数处设一个断点,然后执行程序使其停在断点处,然后按下快捷键Alt+7调出callstack窗口,在窗口中可以看到函数调用的层次关系。
第二种情况比较常见了,我就是犯了这个错误,我在函数里定义了一个局部变量,是一个类对象,该类中有一个大数组,大概是1.5M。
解决办法大致说来也有两种:
1>增加栈内存的数目
2>使用堆内存增加栈内存
第一种解决办法:在VC++6种依次选择Project->Setting->Link,在Category中选择output,在Reserved中输入16进制的栈内存大小如:0x10000000,然后点ok就可以了。
其他编译器也有类似的设置,个人认为这不是一个好办法,有一个致命原因,不知道有没有人遇到过,我把栈内存改大后,与数据库建立不了连接了(ADO方式,Acess数据库),还有遇到调用CreateThread会提示栈不够而创建线程失败,把栈内存还原,问题立刻消失。
不知道究竟是什么原因,有知道的可以告诉我。
第二种解决办法是比较可行的,具体实现由很多种方法可以直接把数组定义改成指针,然后动态申请内存;也可以把局部变量变成全局变量,一个偷懒的办法是直接在定义前边加个static,呵呵,直接变成静态变量(实质就是全局变量)。即可以把上例中的函数这么写:
void test_stack_overflow()
{
static char chdata[2 * 1024 * 1024];
}
当然,除非万不得已,尽量不要使用这么大的数组,出现这种情况多半说明程序结构有问题。
[转]C++ 堆栈溢出的原因以及可行的解决方法的更多相关文章
- 今天发现猎豹浏览器的一个大坑 Request.IsAuthenticated 一直为 false;另外附加原因以及临时的解决方法
今天掉到了一个大坑里面,爬了1个多小时才发现不是代码的问题,居然是浏览器的问题… 下面是问题的发生过程 单点登陆 有2个站点 http://a.abc.com http://b.abc.com ...
- 使用sklearn中的fetch_mldata的错误情况以及可能可行的解决方法
使用sklearn中的fetch_mldata的错误情况以及可能可行的解决方法 在notebook使用的时候出现了报错 from sklearn.datasets import fetch_mldat ...
- silverlight 进行本地串口调用的一种可行的解决方法
silverlight 是一个很不错的开发平台,我们可以设计出很绚丽的界面,用户可以拥有很好的体验,但是就目前来说,进行本地串口的直接调用时不行的,因为安全的原因,有没有相对简单的调用方式呢? 答案是 ...
- html乱码原因与网页乱码解决方法
造成html网页乱码原因主要是html源代码内中文字内容与html编码不同造成.但无论是哪种情况造成乱码在网页开始时候都需要设置网页编码. charset编码设置 html网页乱码效果截图 一.乱码造 ...
- silverlight 进行本地串口调用的一种可行的解决方法 之silverlight端代码
接上边的文章. 在javascript暴露操作activex 串口接收之后,就是silverlight端进行串口数据的显示,我们的显示方式比较简单,只是为了演示,我们每隔1秒进行数据的获取并显示, 为 ...
- 【转】Latex编译报错后中断编译并改正,然后重复出现不明原因报错的解决方法
转自:https://www.douban.com/note/419828344/ 目录: 一.问题描述 二.测试情况(可以跳过,直接看建议) 三.建议 四.参考资料 正文: 问题描述: 错漏某个符号 ...
- XAMPP中Apache因为端口原因不能启动的解决方法
在开启XAMPP的Apache时报出如下错误信息: 9:08:14 PM [Apache] Error: Apache shutdown unexpectedly.9:08:14 PM [Apache ...
- C# 加载图片image --(C#)Image.FromFile 方法会锁住文件的原因及可能的解决方法
Image.FromFile 一旦使用后,对应的文件在一直调用其生成的Image对象被Disponse前都不会被解除锁定,这就造成了一个问题,就是在这个图形被解锁前无法对图像进行操作(比如删除,修改等 ...
- (C#)Image.FromFile 方法会锁住文件的原因及可能的解决方法
Image.FromFile 一旦使用后,对应的文件在一直调用其生成的Image对象被Disponse前都不会被解除锁定,这就造成了一个问题,就是在这个图形被解锁前无法对图像进行操作(比如删除,修改等 ...
随机推荐
- IDEA安装maven和设置自动配置下载包
在我们开发的过程中如果环境配置好了,对于我们开发将优很大作用,减少可开发的时间,接下来我就讲解一下maven的安装和配置,以及在idea上配置,希望此教程同时对大家优帮助. 1.1.下载maven和安 ...
- Premiere Pro cc 2019 下载链接
[安装环境]:win7/win8/win10 [64位下载] 百度网盘链接:pan.baidu.com/s/1mUDK5-CLafUDXn2Rsl-Mjw 提取码:ecx4
- Linux查看网卡传输速率总结
1.使用ethtool命令 ethtool ens192 使用ethtool命令后面直接接网卡名称可以查看到部分信息,包括网卡协商速率等等. 还有一种如果服务器内有很多块网卡,我们想查看具体网 ...
- Codeforces Global Round 2 D 差分 + 前缀和 + 二分
https://codeforces.com/contest/1119/problem/D 题意 有n个数组,每个数组大小为\(10^{18}+1\)且为等差数列,给出n个数组的\(s[i]\),q次 ...
- 题解 P2668 【斗地主】
dfs+简易剪枝+简易a* 思路: dfs+简易剪枝+简易a(我也不知道算不算a): dfs参数记录层数 按消耗牌多少的贪心顺序搜索 有几种情况可以不用搜索(但我还是搜索了) 可以用a*估算出来 最后 ...
- Linux性能优化实战学习笔记:第四讲
一.怎么查看系统上下文切换情况 通过前面学习我么你知道,过多的上下文切换,会把CPU时间消耗在寄存器.内核栈以及虚拟内存等数据的保存和回复上,缩短进程真正运行的时间,成了系统性能大幅下降的一个元凶 既 ...
- java 多行注释
public class Sample { public static void main(String[] args) { // java compiler ignores the comment ...
- 应用层协议:HTTPS
1. HTTPS定义 Hyper Text Transfer Protocol over Secure Socket Layer,安全的超文本传输协议,网景公式设计了SSL(Secure Socket ...
- 推荐一款健康App 多喝水,引领全民时尚喝水生活习惯
推荐一款健康App 多喝水,引领全民时尚喝水生活习惯 1 介绍 多喝水,一款鼓励大众喝水的APP.我们倡导大众健康生活,培养人们爱喝水的习惯,让每一次喝水,都能产生价值,让人们在喝水的同时,可享受赚钱 ...
- 粘包和拆包及Netty解决方案
在RPC框架中,粘包和拆包问题是必须解决一个问题,因为RPC框架中,各个微服务相互之间都是维系了一个TCP长连接,比如dubbo就是一个全双工的长连接.由于微服务往对方发送信息的时候,所有的请求都是使 ...