栈溢出(stackoverflow)的原因及解决办法 stack overflow网站

最近在做一个程序(VC6.0),功能大概有网络通信、数据库、绘图等。测试的时候程序一运行到某个函数就出现此错误,查了很多地方,试了很多解决办法,终于把问题解决了,写个日志提醒一下自己,也希望作为一个普遍解决办法让大家少费工夫(其他编译器也会出现同样的问题)。
大家都知道,Windows程序的内存机制大概是这样的,全局变量(局部的静态变量本质也属于此范围)存储于堆内存,该段内存较大,一般不会溢出;函数地址、函数参数、局部变量等信息存储于栈内存,VC6中栈内存默认大小为1M,对于当前日益扩大的程序规模而言,稍有不慎就可能出问题。
(动态申请的内存即new出来的内存不在栈中)
即如果函数这样写:
voidtest_stack_overflow()
{
char* chdata = new[2*1024*1024];
delete []chdata;
}
是不会出现这个错误的,而这样写则不行:
voidtest_stack_overflow()
{
char chdata[2*1024*1024];
}
大多数情况下都会出现内存溢出的错误,不信在vc6中随便做个程序,调用一下这个函数试式。


出现栈内存溢出的常见原因有2个:
1> 函数调用层次过深,每调用一次,函数的参数、局部变量等信息就压一次栈。
2> 局部静态变量体积太大
第一种情况不太常见,因为很多情况下我们都用其他方法来代替递归调用(反正我是这么做的),所以只要不出现无限制的调用都应该是没有问题的,起码深度几十层我想是没问题的,这个我没试过但我想没有谁会把调用深度作那么多。检查是否是此原因的方法为,在引起溢出的那个函数处设一个断点,然后执行程序使其停在断点处,然后按下快捷键Alt+7调出call stack窗口,在窗口中可以看到函数调用的层次关系。

第二种情况比较常见了,我就是犯了这个错误,我在函数里定义了一个局部变量,是一个类对象,该类中有一个大数组,大概是1.5M。

解决办法大致说来也有两种:
1> 增加栈内存的数目
2> 使用堆内存
增加栈内存方法如下,在vc6种依次选择Project->Setting->Link,在Category中选择output,在Reserve中输入16进制的栈内存大小如:0x10000000,然后点ok就可以了。

其他编译器也有类似的设置,个人认为这不是一个好办法,有一个致命原因,不知道有没有人遇到过,我把栈内存改大后,与数据库建立不了连接了(ADO方式,Acess数据库),把栈内存还原,问题立刻消失。不知道究竟是什么原因,有知道的可以告诉我。
email: la_ariza@sina.com

第二种解决办法是比较可行的,具体实现由很多种方法可以直接把数组定义改成指针,然后动态申请内存;也可以把局部变量变成全局变量,一个偷懒的办法是直接在定义前边加个static,呵呵,直接变成静态变量(实质就是全局变量)。即可以把上例中的函数这么写:

voidtest_stack_overflow()
{
static char chdata[2*1024*1024];
}


当然,除非万不得已,尽量不要使用这么大的数组,出现这种情况多半说明程序结构有问题。

  

爱华网本文地址 » http://www.aihuau.com/a/25101014/229308.html

更多阅读

智能手机速度变慢的原因以及解决办法 下载速度慢的解决办法

智能手机速度变慢的原因以及解决办法——简介人手一机智能手机,不管是高端的还是低端的,但是在买来以后用着用着,我们就发现自己的手机越来越不智能,速度也是变得越来越慢,这是什么原因呢?如何解决这个问题呢?智能手机速度变慢的原因以及

排气管冒黑烟的原因及解决之道 排气管冒黑烟

可能见过车的人都知道,排气管冒黑烟经常看到,如果你是司机的话,对这个异常的现象不了解的话,说明你对柴油机的维修养护方面很欠缺。一般来说,排气管冒黑烟、蓝烟或者灰白烟,基本都是燃料在燃烧室没有得到充分的燃烧所致的。如果柴油机工作

晚上多梦的原因及预防办法 晚上睡觉多梦吃什么药

晚上多梦的原因及预防办法——简介 多梦最明显的症状就是梦境纷纭、睡卧不宁,所以,夜间多梦的人往往睡眠质量低下、白天精神不振。要解决多梦的问题,还要从根源入手,针对病因进行治疗和调节。每个人都做梦。但大多数人醒来后不久就忘记

汽车的挡风玻璃起雾看不清的原因及解决办法 挡风玻璃起雾

有没有遇到过这样的情况呢?启动车子发现汽车的挡风玻璃起雾看不清路况,非常影响驾驶,下面告诉大家这个现象产生的原因和解决办法汽车的挡风玻璃起雾看不清的原因及解决办法——起雾的原因原因很简单,是由于车内和车外的温差,在挡风玻璃上

显示器屏幕抖动的原因及解决办法 液晶显示器屏幕抖动

显示器屏幕抖动的原因及解决办法——简介最近不知怎么回事,显示器屏幕总是出现闪烁或是电脑屏幕抖动,所以到网上查了一下开机却出现电脑屏幕闪烁,电脑屏幕抖动!看屏幕上的字很费眼,导致电脑屏幕闪烁,电脑屏幕抖动的原因也总结下。电脑屏

声明:《栈溢出(stackoverflow)的原因及解决办法 stack overflow网站》为网友夜袭寡妇村分享!如侵犯到您的合法权益请联系我们删除