admin管理员组文章数量:1594602
栈溢出。
VC的默认栈的大小一般的1M或者是2M 很小 你开一个int a[1024/4]就栈溢出了
今天我竟然开了一个int a[1000][1000] 的数组 算一下 足足有将近4个G 不溢出才怪呢。
数组分配的太大,就必须用堆也就是malloc来分配啊,而堆内存的大小基本不说限制,但是栈的大小会受到限制,就要用malloc来分配了(当然C++当中也是可以用new来进行的),大的话就要用堆了。
下面的这一问一答很有意思的:
VC6.0下的堆栈是1M,定义数组太大,就会造成堆栈溢出,怎么办?
1.既然知道原因,那就不要定义那么大的数组; 2.如果必须定义,那么不要定义在栈里面; 3.如果必须定义在栈里面,那么修改编译参数; 4.如果修改了参数都不行,那么修改算法; 5.如果算法修改了也不行,那么变更需求; 6.如果需求不能变更,那么脱离那个项目组或公司; 7.如果换了工作都不行,那么脱离这个行业。 |
一个人的博客
数组开辟过大导致栈溢出现象
有一次在一个函数里面定义了一个维数很大的局部数组,如下所示:
void Fun()
{
BYTE uszBuffer[1024*1024];
..
..
..
.. // 其它代码略
}
程序执行到函数的起始大括号时,就中断了,找到了好久都不知道啥回事,最后得知是 BYTE uszBuffer[1024*1024];
在栈上开辟的内存块过大导致的,栈区一般不支持开辟超过很大的内存,这里1024*1024即 1GB的内存显然是太大了,将数字改
小点,如:10*1024就不会中断了,如果硬要开辟很大的内存,可以用new,即在堆区开辟,如:
BYTE* pszBuffer = new BYTE[1024*124];
在写C++程序中最怕的一问题应是,程序在debug下可以正确无误的运行而在release模式下却发生内存访问的错误。最近就遇到了一个因数组引起的栈溢出问题,费了好长时间才发现。
用VS2005写程序,默认的栈大小是1M。我们在程序中的变量及静态数组都是储存在栈中的。一旦变量和静态数组的规模超过了栈的大小,就会发生栈溢出错误。如运行如下一段代码是无法成功的:
#pragma once
#include <iostream>
using namespace std;
int main()
{
int a[1024*256];
cerr<<"It works"<<endl;
return 0;
}
静态数组a的大小为:1024*256*4字节 =1G字节> 1M字节,因此程序无法正常运行。在项目->属性->链接->系统中增大栈大小后,可以正常运行上面这个程序。
我在codeblocks里面试了以下代码,发现这个编译器的默认栈空间真的是很大的
#include <iostream>
using namespace std;
int main()
{
//2048-15 = 2033M
int a[(1024*2-15)*1024/4];
cerr<<"It works"<<endl;
return 0;
}
本文标签: 错误
版权声明:本文标题:今天遇到了一个非常恶心的错误 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1728179722a1148279.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论