今天遇到了一个非常恶心的错误

来源:互联网 发布:windows上安装apache 编辑:程序博客网 时间:2024/04/30 06:58

栈溢出。

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;}


 

 

原创粉丝点击