全局变量不会,局部变量却内存溢出,是怎么回事?

mechanicser 2016-05-29 11:21:42
请教大神
以下代码是从文件读数据用的

#include <iostream>
#include <fstream>
#include <cstdlib> //exit()
#include <iomanip>
#include <cmath>
#include <string>
#include <ctime>

using namespace std;

const int MAX_SEC = 5; //杆件断面分段数最大取5段
const int MAX_LOAD = 100; //最大荷载数目
const int MAX_BEAM = 10000; //最大杆件数目
struct BEAM_ELEMENT
{
int beam_no;
int j1,j2;
int beamtype_no;
string steel;
double beta;
double length;
};

struct Q_STEEL
{
int thick1,thick2;
double r_tense; //抗拉
double r_press; //抗压抗弯
double r_shear; //抗剪
double r_phole; //孔壁承压
};
struct DATA
{
string Q1,Q2,Q3;
Q_STEEL QC[3];
double QY1,QY2,QY3; //Y=Yield屈服
}steel_data;

struct FORCE
{
double sec_dis; //断面距离(从杆件始端到末端)
double fx,fy,fz;
double mx,my,mz;
};
struct BEAM_FORCE
{
int load_number; //荷载编号
string load_name; //荷载名称
FORCE F[MAX_SEC];
};
struct BEAM_FORCE_FILE
{
int beam_number; //梁编号
BEAM_FORCE BF[MAX_LOAD];
}BFF[MAX_BEAM];

struct BEAM_PROPERTY
{
int beam_type_no;
int side;
int SD; //STRAT DIAMETER
int ED; //END DIAMETER
int THICKNESS;
string ST_TYPE; //STEEL TYPE
};

int COUNT_LINE_NUMBER(char * filename);

int main()
{
int beam_pcs; //梁单元数量
int load_pcs; //工况数量
int beam_sec; //每根杆件断面数
string ENTER; //吃掉换行符用
string NOTHING; //吃掉最上面中文用
ifstream fin;
fin.open("BEAM_FORCE.txt");
if(!fin.is_open())
{
cout << "Fail to open file!" << endl;
cin.get();
exit(EXIT_FAILURE);
}
fin >> beam_pcs;
fin >> load_pcs;
fin >> beam_sec;
getline(fin,ENTER);
getline(fin,NOTHING);

// BEAM_FORCE_FILE BFF[MAX_BEAM];

int i,j,k;
for(i=0;i<beam_pcs;i++)
{
fin >> BFF[i].beam_number;
for(j=0;j<load_pcs;j++)
{
fin >> BFF[i].BF[j].load_number;
fin >> BFF[i].BF[j].load_name;
for(k=0;k<beam_sec;k++)
{
fin >> BFF[i].BF[j].F[k].sec_dis;
fin >> BFF[i].BF[j].F[k].fx;
fin >> BFF[i].BF[j].F[k].fy;
fin >> BFF[i].BF[j].F[k].fz;
fin >> BFF[i].BF[j].F[k].mx;
fin >> BFF[i].BF[j].F[k].my;
fin >> BFF[i].BF[j].F[k].my;
}
}
}
fin.close();

ofstream fout;
fout.open("BEAM_FORCE_COMPARE.TXT");
fout << right << fixed;
for(i=0;i<beam_pcs;i++)
{
fout << setw(3) << BFF[i].beam_number;
for(j=0;j<load_pcs;j++)
{
fout << setw(6) << BFF[i].BF[j].load_number;
fout << setw(20)<< BFF[i].BF[j].load_name;
for(k=0;k<beam_sec;k++)
{
fout << setw(6) << setprecision(3) << BFF[i].BF[j].F[k].sec_dis;
fout << setw(6) << setprecision(3) << BFF[i].BF[j].F[k].fx;
fout << setw(6) << setprecision(3) << BFF[i].BF[j].F[k].fy;
fout << setw(6) << setprecision(3) << BFF[i].BF[j].F[k].fz;
fout << setw(6) << setprecision(3) << BFF[i].BF[j].F[k].mx;
fout << setw(6) << setprecision(3) << BFF[i].BF[j].F[k].my;
fout << setw(6) << setprecision(3) << BFF[i].BF[j].F[k].my << endl;
fout << setw(29);
fout.fill(' ');
}
fout << endl;
}
fout << endl;
}
fout << endl;

fout.close();

return 0;
}

int COUNT_LINE_NUMBER(char * filename)
{
ifstream fin;
fin.open(filename);
int n=0;
string line_data;
if(!fin.is_open())
{
cout << "Fail to open " << filename << "." <<endl;
cin.get();
exit(EXIT_FAILURE);
}
while(getline(fin,line_data))
{
n++;
}
fin.close();
return n;
}

如果struct BEAM_FORCE_FILE这个结构体数组如果在全局变量里定义,如下,那MAX_BEAM取到10000都没问题
struct BEAM_FORCE_FILE
{
int beam_number; //梁编号
BEAM_FORCE BF[MAX_LOAD];
}BFF[MAX_BEAM];


可是如果这里不定义,在main里面定义即

// BEAM_FORCE_FILE BFF[MAX_BEAM];

MAX_BEAM只能取72,这是为什么?

我设了断点(在程序里面插cout输出数字并用cin.get()暂停)看过了,如果在main里面定义这个结构数组,是一开始连
int beam_pcs; //梁单元数量
都不执行,直接报内存错误。
我用的是DEV C++ 4.9.9.2

这是怎么回事呢?求大神指教!
我要读的文件大概是这样的:


另外请教大神,我想我以后如果处理更大数据文件的话,内存溢出不可避免吧,所以我搜索了,貌似有分块处理数据的方法,我想在这方面得到些指点,请大神帮忙指条路,谢谢了!
...全文
642 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-05-30
  • 打赏
  • 举报
回复
按容量大小从小到大:栈、全局数据区、堆、磁盘、云盘、……
paschen 版主 2016-05-30
  • 打赏
  • 举报
回复
引用 8 楼 mechanicser 的回复:
[quote=引用 3 楼 paschen 的回复:]

BEAM_FORCE_FILE *p = new BEAM_FORCE_FILE[MAX_BEAM];
好的好的!我回去学习下这方面的知识! 可是为什么我全局就可以设置那么大,局部就不可以呢?[/quote] 全局变量和局部变量存的地方是不同的
lm_whales 2016-05-29
  • 打赏
  • 举报
回复
你的。每个数据的数据量,似乎都不大,最多才10000 只是他们都在嵌套着,这是要用乘法的
lm_whales 2016-05-29
  • 打赏
  • 举报
回复
struct FORCE { double sec_dis; //断面距离(从杆件始端到末端) ///8 double fx,fy,fz; ///24 double mx,my,mz; ///24 }; ///56 struct BEAM_FORCE { int load_number; //荷载编号 4 string load_name; //荷载名称 //一般在24~32 不等,可能还更多,动态分配的没计算在内,不同编译器的 string实现不同 FORCE F[MAX_SEC]; // 56*5 =280 这不是一般的多 }; // 大约 >= 300 字节 struct BEAM_FORCE_FILE { int beam_number; //梁编号 //4 BEAM_FORCE BF[MAX_LOAD]; // >=300 *100 }BFF[MAX_BEAM]; //>= 30000 *10000 =3 亿 =300M ,还好 作为 外部变量,静态变量还马马虎虎。动态分配也还行 ///字符串,的字符数,想必也不多。但是影响也很大的。毕竟数量多
paschen 版主 2016-05-29
  • 打赏
  • 举报
回复

BEAM_FORCE_FILE *p = new BEAM_FORCE_FILE[MAX_BEAM];
paschen 版主 2016-05-29
  • 打赏
  • 举报
回复
数组太大就在堆上动态分配
lm_whales 2016-05-29
  • 打赏
  • 举报
回复
10000*100*sizeof(int )=4M 左右 可怜 windows 太吝啬 通常堆栈 只有1M~2M
mechanicser 2016-05-29
  • 打赏
  • 举报
回复
引用 12 楼 u010165006 的回复:
局部变量分配在栈上(栈大小有限),全局变量和静态变量分配在全局内存区,malloc和new的分配在堆上。
嗯!谢谢!
mechanicser 2016-05-29
  • 打赏
  • 举报
回复
引用 11 楼 lm_whales 的回复:
局部变量,用完即扔的特性,非常适合在栈上 栈空间,如非递归。一般程序,用不了多少,所以栈都不大。 栈空间,是所有调用链中的函数,公用的,不仅仅,变量用, 函数调用本身也用它储存,函数返回地址 栈是临时使用的数据空间 永久性的占用空间的数据, 一般不在堆栈中
嗯嗯!学习了!
ooolinux 2016-05-29
  • 打赏
  • 举报
回复
局部变量分配在栈上(栈大小有限),全局变量和静态变量分配在全局内存区,malloc和new的分配在堆上。
lm_whales 2016-05-29
  • 打赏
  • 举报
回复
局部变量,用完即扔的特性,非常适合在栈上 栈空间,如非递归。一般程序,用不了多少,所以栈都不大。 栈空间,是所有调用链中的函数,公用的,不仅仅,变量用, 函数调用本身也用它储存,函数返回地址 栈是临时使用的数据空间 永久性的占用空间的数据, 一般不在堆栈中
lqbk1 2016-05-29
  • 打赏
  • 举报
回复
mechanicser 2016-05-29
  • 打赏
  • 举报
回复
引用 7 楼 lm_whales 的回复:
试试定义3维数组 每维 1000 估计,动态分配,也有点小够呛 typedef int arr3[1000][1000][1000];//接近4G 32Bits系统,不可能分配这么多内存 arr3*p=new arr3[1]{0}; 32Bits 系统,估计一样溢出
为什么局部变量申请到的比全局变量要那么多呢? 动态分配不是太熟,在C++ Primer Plus上主要学习了数组,对于结构数组还不太熟,不过会去查些资料好好学习下!还有我想就是数据分块处理,这个弄好了就不需要管这么多了吧。
mechanicser 2016-05-29
  • 打赏
  • 举报
回复
引用 3 楼 paschen 的回复:

BEAM_FORCE_FILE *p = new BEAM_FORCE_FILE[MAX_BEAM];
好的好的!我回去学习下这方面的知识! 可是为什么我全局就可以设置那么大,局部就不可以呢?
lm_whales 2016-05-29
  • 打赏
  • 举报
回复
试试定义3维数组 每维 1000 估计,动态分配,也有点小够呛 typedef int arr3[1000][1000][1000];//接近4G 32Bits系统,不可能分配这么多内存 arr3*p=new arr3[1]{0}; 32Bits 系统,估计一样溢出
小灸舞 2016-05-29
  • 打赏
  • 举报
回复
一般栈空间都只有几M
需要更大的空间用malloc和new在堆上申请

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧