在c++中我用class定义一个学生类,然后用new来申请这个类的动态数组,但是最终delete时报错。为什么呢?怎么改?

whale_shark 2014-12-13 12:44:50
#include<iostream>
#include<cstring>
using namespace std;

class student
{
private:
char *n;
int no;
float m,e;
public:
student(char p[]="0",int o=0,float t=0,float g=0)
{ if(p)
{ n=new char[strlen(p)+1];
strcpy(n,p);
}
else
cout<<"无名氏";
no=o;m=t;e=g;
}
float sum()
{ int s;
s=m+e;
return s;
}
float ave()
{ int a;
a=(m+e)/2;
return a;
}
void input(char p[10]="无名氏",int o=0,float t=0,float g=0)
{ n=new char[strlen(p)+1];
strcpy(n,p);
no=o;m=t;e=g;
}
void print()
{ cout<<"姓名:"<<n<<" "<<"学号:"<<no<<" "<<"数学:"<<m<<" "<<"英语:"<<e<<" "<<"平均成绩:"<<ave()<<" "<<"总成绩:"<<sum()<<'\n';
}
~student(){delete []n;}
};

int main()
{ student z;
char na[10];
int No;
float ma,en;
int y,s2=0,s1=0;
cout<<"输入学生人数:";
cin>>y;
student*x=new student[y];
for(int i=0;i<y;i++)
{ cout<<"输入第"<<i+1<<"名学生的姓名,学号,数学和英语成绩";
cin>>na>>No>>ma>>en;
x[i].input(na,No,ma,en);
s1+=ma;
s2+=en;
}
cout<<"数学平均成绩"<<s1/y<<'\n'<<"英语平均成绩"<<s2/y<<'\n';
for(i=1;i<y;i++)
{ for(int j=0;j<y;j++)
if(x[j].sum()>x[j+1].sum())
{ z=x[j];
x[j]=x[j+1];
x[j+1]=x[j];
}
}
if(y<=5)
x[0].print();
else
for(i=0;i<y/5;i++)
x[i].print();

delete []x;
return 0;
}
...全文
436 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Evankaka 2014-12-15
  • 打赏
  • 举报
回复
帮你看了,有问题,你最后释放时,应该先delete掉,x[i].n里的,你如果把x[i]先delete掉,这时就找到不x[i].n的数据了,,
代码我帮你改了一下,可以运行了
#include<iostream>
#include<cstring>
using namespace std;

class student
{
private:

int no;
float m,e;
public:
char *n;//改到这里来
student(char p[]="0",int o=0,float t=0,float g=0)
{ if(p)
{ n=new char[strlen(p)+1];
strcpy(n,p);
}
else
cout<<"无名氏";
no=o;m=t;e=g;
}
float sum()
{ int s;
s=m+e;
return s;
}
float ave()
{ int a;
a=(m+e)/2;
return a;
}
void input(char p[10]="无名氏",int o=0,float t=0,float g=0)
{ n=new char[strlen(p)+1];
strcpy(n,p);
no=o;m=t;e=g;
}
void print()
{ cout<<"姓名:"<<n<<" "<<"学号:"<<no<<" "<<"数学:"<<m<<" "<<"英语:"<<e<<" "<<"平均成绩:"<<ave()<<" "<<"总成绩:"<<sum()<<'\n';
}
~student(){
if(n!=NULL)//加个判断好点
{delete []n;
n=NULL;
}
}
};

int main()
{ student z;
char na[10];
int No;
int i,j;//i,j
float ma,en;
int y,s2=0,s1=0;
cout<<"输入学生人数:";
cin>>y;
student*x=new student[y];
for(i=0;i<y;i++)
{ cout<<"输入第"<<i+1<<"名学生的姓名,学号,数学和英语成绩";
cin>>na>>No>>ma>>en;
x[i].input(na,No,ma,en);
s1+=ma;
s2+=en;
}
cout<<"数学平均成绩"<<s1/y<<'\n'<<"英语平均成绩"<<s2/y<<'\n';
for(i=1;i<y;i++)
{ for(j=0;j<y;j++)
if(x[j].sum()>x[j+1].sum())
{ z=x[j];
x[j]=x[j+1];
x[j+1]=x[j];
}
}
if(y<=5)
x[0].print();
else
for(i=0;i<y/5;i++)
x[i].print();

for(i=0;i<y;i++)
{
if(x[i].n!=NULL)//加个判断好点,相当于先释放子容器
{
delete []x[i].n;
x[i].n=NULL;
}
}
delete []x;//再释放你容器
while(1);
return 0;
}

xionggch 2014-12-15
  • 打赏
  • 举报
回复
在student类中,你在构造函数中已经给char *n new了空间,又在input函数new,造成内存泄露; 可以在构造中n=NULL; 在析构函数中加判断 if (n) delete []n; 最后delete []x 建议改为 for( int i=0; i<y; i++ ) { delete x; }
ztenv 版主 2014-12-13
  • 打赏
  • 举报
回复
初步看是未初始化指针导至的
fly_dragon_fly 2014-12-13
  • 打赏
  • 举报
回复
char *n; 这个成员有初始化吗
FightForProgrammer 2014-12-13
  • 打赏
  • 举报
回复
调试调试

65,186

社区成员

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

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