析构函数的问题

fupeng1114 2011-04-23 12:02:59

#include<iostream>
using namespace std;
class Stud
{
private:
char *no;
char *name;
double deg;
static double sum;
static double num;
public:
Stud(){}
~Stud()
{
delete []no;
delete []name;
}
void setdata(char*,char *,double);
void disp();
static double avg();
};
void Stud::setdata(char*nu,char *na,double d)
{
no=new char[strlen(nu)+1];
strcpy(no,nu);
name=new char[strlen(na)+1];
strcpy(name,na);
deg=d;
sum+=deg;
num++;
}
void Stud::disp()
{
cout<<"学号:"<<no<<"\t姓名:"<<name<<"\t成绩:"<<deg<<endl;
}
double Stud::avg()
{
return sum/num;
}
double Stud::sum=0;
double Stud::num=0;
void main()
{
char no[20],na[20];
double d;
int i=0;
Stud st[20];
while(no[1]!='#' &&na[0]!='#' &&d!=0)
{
cout<<"请输入学号:";
cin>>no;
cout<<"请输入姓名:";
cin>>na;
cout<<"请输入成绩:";
cin>>d;
if(no[1]!='#' &&na[0]!='#' &&d!=0)
st[i++].setdata(no,na,d);
}
for(int j=0;j<i;j++)
st[j].disp();
cout<<st[i-1].avg()<<endl;

}

去掉类中的析构函数就没有问题,加上就出现问题了,为什么 啊???????????????
...全文
83 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
书虫 2011-04-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hhh_hao 的回复:]
C/C++ code

~Stud()
{
if(no != NULL)
delete []no;
if(name != NULL)
delete []name;
}
[/Quote]
光这么加不对!
书虫 2011-04-23
  • 打赏
  • 举报
回复
你这么改试一下:
class Stud
{
private:
char *no;
char *name;
double deg;
static double sum;
static double num;
public:
Stud(){ no = NULL; name = NULL; } // 构造和析构需要修改
~Stud()
{
if (no)
{
delete []no;
}
if (name)
{
delete []name;
}
}
void setdata(char*,char *,double);
void disp();
static double avg();
};
hhh_hao 2011-04-23
  • 打赏
  • 举报
回复

~Stud()
{
if(no != NULL)
delete []no;
if(name != NULL)
delete []name;
}

fupeng1114 2011-04-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 happymawolf 的回复:]
因为 char *no;
char *name;
在你的构造函数中没有置空,所以其指向一个随机的地址,当你声明Stud st[20];
时,并不是所有的st[i]都调用了.setdata(no,na,d);
这样,在析构时就会delete一个随机的地址,肯定会出错!
当你用默认析构函数时,就不会释放你已经new的空间,导致内存泄露!
[/Quote]


你的这个解法是不是最佳的啊??????????
fupeng1114 2011-04-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wulibin136 的回复:]

问题不在析构函数,析构函数这样写是不会错的,
但main函数里有问题

void main()
{
char no[20]={0},na[20]={0};
double d=1;
int i=0;
Stud st[20];
while(no[1]!='#' &&na[0]!='#' &&d!=0)
{
cout<<"请输入学号:";
cin……
[/Quote]
应该不是主函数的问题
书虫 2011-04-23
  • 打赏
  • 举报
回复
淡蓝 2011-04-23
  • 打赏
  • 举报
回复
问题不在析构函数,析构函数这样写是不会错的,
但main函数里有问题

void main()
{
char no[20]={0},na[20]={0};
double d=1;
int i=0;
Stud st[20];
while(no[1]!='#' &&na[0]!='#' &&d!=0)
{
cout<<"请输入学号:";
cin>>no;
cout<<"请输入姓名:";
cin>>na;
cout<<"请输入成绩:";
cin>>d;
if(no[1]!='#' &&na[0]!='#' &&d!=0)
st[i++].setdata(no,na,d);
}
for(int j=0;j<i;j++)
st[j].disp();
cout<<st[i-1].avg()<<endl;

}
你那几个办量都没初始化就拿去用是会错的
fupeng1114 2011-04-23
  • 打赏
  • 举报
回复
谢谢啊,我明白了
书虫 2011-04-23
  • 打赏
  • 举报
回复
因为 char *no;
char *name;
在你的构造函数中没有置空,所以其指向一个随机的地址,当你声明Stud st[20];
时,并不是所有的st[i]都调用了.setdata(no,na,d);
这样,在析构时就会delete一个随机的地址,肯定会出错!
当你用默认析构函数时,就不会释放你已经new的空间,导致内存泄露!
fupeng1114 2011-04-23
  • 打赏
  • 举报
回复
如果去掉析构函数就没有出错啊????????去掉析构后,那个默认析构函数会不会释放那个new的空间啊?????

65,210

社区成员

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

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