内存分配异常 std::bad_alloc

garkfbiafiaala 2014-05-17 05:41:25
以下是我写的一个学生成绩管理系统


//头文件
#include<string>
using std::string;
class student
{
private:
int age;
char name[20];
double math;
double computer;
double english;
string code;

public:
student(int a,const char* n,double m,double c,double e,string co);
student();
void show();
student(const student& stu);
bool code_same(string co){return code==co;}
double sum(){return math+english+computer;}
char* s_name(){return name;}



};





//成员函数以及其他函数所在文件
#include"program_head.h"
#include<iostream>
#include<fstream>
const int LIM=20;
extern const char*file;
inline void eatline(){while(std::cin.get()!='\n')continue;}
student::student(int a,const char* n,double m,double c,double e,string co)//构造函数
{

age=a;
strcpy(name,n);
math=m;
computer=c;
english=e;
code=co;
}
student::student()//默认构造函数
{
}
void student::show()
{
using std::endl;
using std::cout;
cout<<"名字:"<<name<<endl
<<"年龄:"<<age<<endl
<<"数学成绩:"<<math<<endl
<<"英语成绩:"<<english<<endl
<<"计算机成绩:"<<computer<<endl
<<"学号:"<<code<<endl<<endl;

}
student::student(const student& stu)//构造函数
{

age=stu.age;
strcpy(name,stu.name);
math=stu.math;
computer=stu.computer;
english=stu.english;
code=stu.code;
}




int mainmenu()//菜单函数
{
using std::cout;
using std::cin;
using std::endl;
int n;
cout<<"\n\n 欢迎进入成绩管理系统"<<endl<<endl
<<" ////////////////////////////////////////////////////////////////////////////"<<endl
<<" ///////////////////////////////////////////////////////////////////////////"<<endl
<<" /////// 1: 录入学生成绩信息 ///////////"<<endl
<<" /////// 2: 显示学生成绩信息 /////////////"<<endl
<<" /////// 3: 查找学生成绩信息 ///////////"<<endl
<<" /////// 4: 删除学生成绩信息 /////////////"<<endl
<<" /////// 5: 修改学生成绩信息 ///////////"<<endl
<<" /////// 6: 统计所有学生成绩 ///////////"<<endl
<<" /////// 7: 清除所有成绩信息 ///////////"<<endl
<<" /////// 0: 退出系统 * *"<<endl
<<" ////////////////////////////////////////////////////////////////////////////"<<endl
<<" ////////////////////////////////////////////////////////////////////////////"<<endl
<<" 请选择:";
while(!(cin>>n))
{
cout<<"请输入数字0-6!"<<endl;
cin.clear();
cin.sync();
}
return n;
}

int input(std::fstream & fs,student & stu,int cou)//录入函数
{
using std::cout;
using std::cin;
using std::endl;
int age;
char name[20];
double math;
double computer;
double english;
student student_ex2;

string code;
eatline();
cout<<"输入你的名字"<<endl;
cin.get(name,LIM);
eatline();
cout<<"输入你的年龄"<<endl;
cin>>age;
cout<<"输入你的数学成绩"<<endl;
cin>>math;
cout<<"输入你的计算机成绩"<<endl;
cin>>computer;
cout<<"输入你的英语成绩"<<endl;
cin>>english;
cout<<"输入你的学号"<<endl;
cin>>code;
while(code.size()!=12)
{
cout<<"错误!请重新输入12位学号:"<<endl;
cin>>code;
cout<<endl;
}
student student_ex1(age,name,math,computer,english,code);
stu=student_ex1;
fs.write((char*)&stu,sizeof stu);
cou++;
return 0;

}
void show(std::fstream & fs,student & stu)//显示函数
{
using std::cout;
using std::cin;
using std::endl;
using std::cerr;
if(fs.is_open())
{
fs.clear();
fs.seekg(0);
if(fs.fail())
{
cerr<<"error on attempted seek"<<endl;
exit(EXIT_FAILURE);
}
cout<<"以下是文件内容"<<endl;
while(fs.read((char*)&stu,sizeof stu))
{
stu.show();
}
if(fs.eof())
fs.clear();
else
{
cerr<<"error in reading "<<file<<".\n";
exit(EXIT_FAILURE);
}
}
else
{
cerr<<file<<" 打开失败-byed.\n";
exit(EXIT_FAILURE);
}
}

void search(std::fstream & fs,student & stu)//搜索函数
{
eatline();
string co;
using std::cout;
using std::cin;
using std::endl;
using std::cerr;
using std::ios_base;
using std::streampos;
int size=sizeof stu;
int rec=0;
fs.seekg(0);
cout<<"输入你想搜索的学生学号: "<<endl;
cin>>co;
streampos place=rec*sizeof stu;
while(fs.read((char*)&stu,sizeof stu))
{

if(stu.code_same(co))
stu.show();
else
{
rec++;
place=rec*sizeof stu;
fs.seekg(place);

}
}
fs.clear();
}

void correct_record(std::fstream & fs,student & stu)//修改函数
{
int age;
char name[20];
double math;
double computer;
double english;
string code;
eatline();
string co;
using std::cout;
using std::cin;
using std::endl;
using std::cerr;
using std::ios_base;
using std::streampos;
using std::flush;
int size=sizeof stu;
int rec=0;
fs.seekg(0);
cout<<"输入你想修改的学生的学号: "<<endl;
cin>>co;
streampos place=rec*sizeof stu;
while(fs.read((char*)&stu,sizeof stu))
{

if(stu.code_same(co))
{
eatline();
cin.get(name,LIM);
eatline();
cin>>age;
cin>>math;
cin>>computer;
cin>>english;
cin>>code;
student student_ex(age,name,math,computer,english,code);
stu=student_ex;
fs.seekg(place);
fs.write((char*)&stu,sizeof stu)<<flush;
}
else
{
rec++;
place=rec*sizeof stu;
fs.seekg(place);

}
}
fs.clear();
}
void delete_record(std::fstream & fs,student * stu)//删除函数
{
using std::fstream;
using std::ios_base;
using std::cin;
using std::cout;
int i=0,record;
string co;
int j=0;

fs.seekg(0);
while(fs.read((char*) &stu[i],sizeof stu[i])){i++;}
if(fs.eof())
fs.clear();
else
{
std::cerr<<"error in reading "<<file<<std::endl;
exit(EXIT_FAILURE);
}
cout<<"输入你想删除的学生的学号:";
cin>>co;
while(!stu[j].code_same(co))
{
j++;
}

record=j;
for(;record<i;record++)
stu[record]=stu[record+1];

std::ofstream fout(file);
fout.close();
fs.seekg(0);
if(record==0||record==i)
{
for(int h=0;h<i-1;h++)
fs.write((char*)&stu[h],sizeof stu[h]);
}
else
{
for(int h=0;h<record;h++)
fs.write((char*)&stu[h],sizeof stu[h]);
for(int w=record+1;w<i-1;w++)
fs.write((char*)&stu[w],sizeof stu[w]);
}

}

void statistics(std::fstream & fs,student *stu,char ch9,int coun)//统计函数
{
using std::cout;
int i=0,j=0;
if(ch9!='y'&& coun!=0)
fs.clear();
fs.seekg(0);
student temp;
while(fs.read((char*)&stu[i],sizeof stu[i])){i++;}

for(int z=0;z<i;z++)
{
for(int f=i-1;f>=z;f--)
{
if(stu[f].sum()<stu[f-1].sum())
{
temp=stu[f];
stu[f]=stu[f-1];
stu[f-1]=temp;
}
}
}
cout<<"总分排名(升序)"<<std::endl;
for(int z=0;z<i;z++)
cout<<stu[z].s_name()<<": "<<stu[z].sum()<<std::endl;
}





//主函数文件

#include"program_head.h"
#include<fstream>
#include<iostream>
#include<vector>
extern const char*file="D:\\system.txt";
int count=0;
inline void eatline(){while(std::cin.get()!='\n')continue;}
extern int input(std::fstream & fs,student & stu,int cou);
extern void show(std::fstream & fs,student & stu);
extern void search(std::fstream & fs,student & stu);
extern void correct_record(std::fstream & fs,student & stu);
extern void delete_record(std::fstream & fs,student *stu);
extern void reset(){std::ofstream fout(file); fout.close();}
extern void statistics(std::fstream & fs,student *stu,char ch9,int coun);
extern int mainmenu();
int main()
{
int count=0;
student student_ori;
student student_group[30];
using namespace std;
student student_temp;
cout<<fixed;
char ch2;
cout<<"你是第一次使用本系统吗?(y or n)"<<endl;
cin>>ch2;
while(ch2!='y'&&ch2!='n')
{
cout<<"请重新输入:"<<endl;
cin>>ch2;
}
if(ch2=='y')
{
ofstream fout(file);
fout.close();
}
fstream finout;
finout.open(file,ios_base::out|ios_base::in|ios_base::binary|ios_base::ate);
int answer;
char ch='y';
while(ch=='y')
{
answer=mainmenu();
switch(answer)
{
case 1:input(finout,student_group[count],count);break;
case 2:show(finout,student_temp);break;
case 3:search(finout,student_temp);break;
case 4:delete_record(finout,student_group);break;
case 5:correct_record(finout,student_temp);break;
case 6:statistics(finout,student_group,ch2,count);count++;break;
case 7:reset();break;
case 0:exit(0);break;
default:cout<<"你的输入非法的!";system("pause");
}

cout<<"你要继续吗?(请输入y或n)";
cin>>ch;
if(ch=='n')
exit(0);
else
while(ch!='y'&&ch!='n')
{
cout<<"请重新输入:"<<endl;
cin>>ch;
}
if(ch=='n')
exit(0);

}
system("pause");
}



问题是我在使用录入函数录入了6个学生的信息,再使用显示函数来显示这六个人的信息后,再调用统计函数时出现了如下错误
求大神指教
...全文
440 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
garkfbiafiaala 2014-05-17
  • 打赏
  • 举报
回复
好吧,我自己解决了,原来是我统计函数里的那个排序法写错了
garkfbiafiaala 2014-05-17
  • 打赏
  • 举报
回复
引用 1 楼 zhangyonghui2117 的回复:
引自:std::bad_alloc异常的发生一是内存不足,二是内存碎片太多,导致无法申请所需的完整内存。 1. 判断是否内存泄露 2. 判断是否死循环
你这回答我早看过了,就是我检查不出来哪里有错才发上来的啊
「已注销」 2014-05-17
  • 打赏
  • 举报
回复
引自:std::bad_alloc异常的发生一是内存不足,二是内存碎片太多,导致无法申请所需的完整内存。 1. 判断是否内存泄露 2. 判断是否死循环

64,639

社区成员

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

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