最近工作中遇到的堆栈溢出的问题

最近使用Onvif协议抓图的时候,由于抓图的质量偏高所以需要较大的空间,但每次抓图后都会产生崩溃问题,排查过后发现是栈溢出的问题,特此记录
栈溢出(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>局部静态变量体积太大
第一种情况不太常见,因为很多情况下我们都用其他方法来代替递归调用,所以只要不出现无限制的调用都应该是没有问题的。
第二种情况比较常见了,我就是犯了这个错误,我在函数里定义了一个局部变量,是一个类对象,该类中有一个大数组,大概是1.5M。
解决办法大致说来也有两种:
1>增加栈内存的数目
2>使用堆内存增加栈内存

第一种解决办法:在VC++6种依次选择Project->Setting->Link,在Category中选择output,在Reserved中输入16进制的栈内存大小如:0x10000000,然后点ok就可以了。

第二种解决办法是比较可行的,具体实现由很多种方法可以直接把数组定义改成指针,然后动态申请内存;也可以把局部变量变成全局变量,一个偷懒的办法是直接在定义前边加个static,呵呵,直接变成静态变量(实质就是全局变量)。即可以把上例中的函数这么写:
void test_stack_overflow()
{
static char chdata[2 * 1024 * 1024];
}
当然,除非万不得已,尽量不要使用这么大的数组,出现这种情况多半说明程序结构有问题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值