今天遇到了一个非常恶心的错误
2013-10-05 19:38
274 查看
栈溢出。
VC的默认栈的大小一般的1M或者是2M 很小 你开一个int a[1024/4]就栈溢出了
今天我竟然开了一个int a[1000][1000] 的数组 算一下 足足有将近4个G 不溢出才怪呢。
数组分配的太大,就必须用堆也就是malloc来分配啊,而堆内存的大小基本不说限制,但是栈的大小会受到限制,就要用malloc来分配了(当然C++当中也是可以用new来进行的),大的话就要用堆了。
下面的这一问一答很有意思的:
VC6.0下的堆栈是1M,定义数组太大,就会造成堆栈溢出,怎么办?
一个人的博客
数组开辟过大导致栈溢出现象
有一次在一个函数里面定义了一个维数很大的局部数组,如下所示:
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里面试了以下代码,发现这个编译器的默认栈空间真的是很大的
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; }
相关文章推荐
- 今天犯了一个非常low的错误❌。关于UINavigationController 和UITabBarController
- 今天使用babel遇到的一个错误
- 今天遇到了一个Spring出现的一个未知错误,分享下
- 今天调试程序遇到了一个致命问题语法错误操作符丢失
- 今天使用VS2012遇到一个问题:"链接器工具错误 LNK2026 XXX模块对于 SAFESEH 映像是不安全的"
- 今天使用VS2012遇到一个问题:"链接器工具错误 LNK2026 XXX模块对于 SAFESEH 映像是不安全的"
- 今天遇到的一个无聊编译错误:C1900:IL P1 P2版本不匹配 (罪魁祸首是AMD X2 4000+?。。)
- 今天使用VS2012遇到一个问题:"链接器工具错误 LNK2026 XXX模块对于 SAFESEH 映像是不安全的"
- 今天使用VS2015遇到一个问题:"链接器工具错误 LNK2026 XXX模块对于 SAFESEH 映像是不安全的"
- VMware启动时今天遇到一个很恶心的问题
- 遇到一个<iostream>引发的非常难缠的连接错误LNK2001
- Asp今天遇到的一个ASP的小错误
- “SecureCRT遇到一个致命的错误且必须关闭”处理办法
- Latex 1: 解决latex中遇到一个常见错误:"Improper alphabetic constant."
- 遇到一个Linux文件系统因bios时间错误变成只读的问题
- 今天犯的一个错误,学得到不少东西,哈哈
- jsdoc3初次使用的遇到的一个错误:Error: Module jsdoc.js not found.
- 今天在工作中遇到的一个问题
- 遇到一个android错误,记录一下
- VS2012遇到一个问题:"链接器工具错误 LNK2026 XXX模块对于 SAFESEH 映像是不安全的"