今天遇到了一个非常恶心的错误
来源:互联网 发布: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;}
- 今天遇到了一个非常恶心的错误
- 最恶心的bug 今天遇到了
- 今天上午遇到了非常恶心的Service Unavailable
- 今天发生了非常的恶心的事情,极度恶心pb数据库系统
- VMware启动时今天遇到一个很恶心的问题
- 今天犯了一个非常low的错误❌。关于UINavigationController 和UITabBarController
- 今天使用babel遇到的一个错误
- 今天看到了一个非常有意思的签名档......
- 今天碰到了一个我非常佩服的售票员
- 今天碰到了一个我非常佩服的售票员
- 今天遇到的错误
- 今天遇到的错误
- django 一个恶心的bug 10053 错误
- 非常恶心的一个python 调用webservice问题
- 记录今天遇到的问题,一个低级错误。。
- 第一次写博客,记录一下今天遇到的一个错误
- 今天遇到了一个很有趣的问题
- 今天遇到了一个form表单的问题
- 新建项目(failed to import..)解决方法
- ios页面间传递参数四种方式
- 组合数递推模版
- 自己写代理服务器
- MFC dll注入框架
- 今天遇到了一个非常恶心的错误
- 数据库层
- configure编译中常见的错误
- C++学习书籍
- ZOJ 3478 SPFA
- 查找之杨氏矩阵
- 外企那些事儿
- Euclid's Game
- 黑马程序员-我的摘录-正则表达式总结-需要加强