为什么最后delete时候析构函数会无限调用?

csu之c 2020-04-02 08:34:34
#include <iostream>
using namespace std;
class Student{
public:
Student(){num = 0; name[0] = '0'; sex[0] = '0'; age = 0; score[0] = {0}; average = 0;}
void Setstudent(int n, char na[10], char s[3], int a, double sc1, double sc2, double sc3 = 0);
void show();
void Setaverage(double sc1, double sc2, double sc3);
void Setaverage(double sc1, double sc2);
double Getaverage(){return average;}
~Student(){cout << "析构函数" << endl;}
private:
int num;
char name[10];
char sex[3];
int age;
double score[3], average;
};

void Student::show(){
cout << "学号:" << num << "\n姓名:" << name << "\n性别:" << sex
<< "\n年龄:" << age << "\n语文成绩:" << score[0] << "\n数学成绩:" << score[1];
if(score[2] != 0)
cout << "\n英语成绩:" << score[2] << "\n平均成绩:" << average << endl;
else cout << "\n平均成绩:" << average << endl;
}

void Student::Setaverage(double sc1, double sc2, double sc3){average = (sc1 + sc2 + sc3)/3;}
void Student::Setaverage(double sc1, double sc2){average = (sc1 + sc2)/2;}

void Student::Setstudent(int n, char na[10], char s[3], int a, double sc1, double sc2, double sc3)
{
num = n; age = a; score[0] = sc1; score[1] = sc2; score[2] = sc3;
for(int i = 0; i < 10; i++){name[i] = na[i];}
for(int i = 0; i < 3; i++){sex[i] = s[i];}
}
int main()
{
int n;
cout << "请输入学生人数:";
cin >> n;
Student *p = new Student[n];
Student *pt = p;
double max1 = 0, max2 = 0, max3 = 0, sum1 = 0, sum2 = 0, sum3 = 0;
for(int i = 0; i < n; i++, pt++){
int num;
char name[10];
char sex[3];
int age, n1;
double sc1, sc2, sc3;
cout << "请输入第" << i + 1 << "个学生信息" << endl;
cout << "学号:";
cin >> num;
cout << "姓名:";
cin >> name;
cout << "性别:";
cin >> sex;
cout << "年龄:";
cin >> age;
cout << "科目数:";
cin >> n1;
cout << "各科成绩:";
if(n1 == 2){
cin >> sc1 >> sc2;
if(sc1 > max1){max1 = sc1;}
if(sc2 > max2){max2 = sc2;}
sum1 += sc1; sum2 += sc2;
(*pt).Setaverage(sc1, sc2);
(*pt).Setstudent(num, name, sex, age, sc1, sc2);
}
else{
cin >> sc1 >> sc2 >> sc3;
if(sc1 > max1){max1 = sc1;}
if(sc2 > max2){max2 = sc2;}
if(sc3 > max3){max3 = sc3;}
sum1 += sc1; sum2 += sc2; sum3 += sc3;
(*pt).Setaverage(sc1, sc2, sc3);
(*pt).Setstudent(num, name, sex, age, sc1, sc2, sc3);
}
}
for(int i = 0; i < n; i++, p++){
cout << "第"<< i+1 << "位同学成绩:";
p -> show();
}
delete[] p;
}

为什么最后调用析构函数的时候无限调用?
...全文
162 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
abcd7038 2020-04-04
  • 打赏
  • 举报
回复
直接使用动态指针比较容易出错,可以考虑用智能指针,在头文件memory中,建议用
shared_ptr<Student> p;/*...*/
这样子不需要再用的时候它会自动delete,比较少出错
oraclefan 2020-04-04
  • 打赏
  • 举报
回复
用一个指针q记录下p这个数组的首地址 q=p,最后delete[] q.
qybao 2020-04-02
  • 打赏
  • 举报
回复
最后的for循环有p++,p不再指向原来的数组的首地址了,所以delete的指针不对了

64,636

社区成员

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

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