我正在做一个c ++书籍的问题,并且在这个特定的部分被引用了
"编写程序,询问有多少分数和有多少学生。然后应该动态分配一个结构数组,每个结构的Test成员都应该指向一个动态分配的数组,该数组将保存测试分数,在数组被动态分配后,程序应该询问id号和测试分数每个学生"。
现在我在for循环中出现问题,其中存在内存泄漏并且程序在输入值后崩溃,有什么建议吗?
struct Course
{
string Name;
int IdNumber;
int *Tests;
int Average;
int courseGrade;
};
void Result(int,int );
int main()
{
cout<<"please enter number of test score ";
int testScore;
cin>>testScore;
int numberofStudents;
cout<<"please enter number of student there is ";
cin>>numberofStudents;
Result(numberofStudents,testScore);
}
void Result(int numberofStudents,int testScore)
{
const int Size=numberofStudents;
const int Size1=testScore;
Course *object=nullptr;
object=new Course[numberofStudents];
object->Tests = new int[testScore];
for(int i=0;i<testScore;i++)
{
cin>>object[i].Tests[i];
}
}
please enter number of the test scores :3
please enter number of students there is :3
34
90
输入90后程序崩溃
答案 0 :(得分:1)
这是我怀疑发生的事情:
在此for
循环中:
for(int i=0;i<testScore;i++)
{
cin>>object[i].Tests[i];
}
您使用object
作为索引来访问testScore
。如果testScore
大于object
的长度,则会遇到问题。
内存泄漏问题来自于您为object
的{{1}}和每个Tests
成员分配空间,但您永远不会释放该内存。
答案 1 :(得分:0)
存在内存泄漏,因为您使用new
分配内容并且永远不会使用delete
释放它们。
至于崩溃,它是由这条线引起的:
object->Tests = new int[testScore];
请记住object
不是课程对象,它是课程对象的数组,每个对象都需要它自己的{{1数组。该行实际上只是Tests
所以你需要object[0].Tests = ...
上的循环来分配每个课程中的测试,而numberofStudents
上的另一个循环围绕numberofStudents
(你已经拥有)的循环来收集所有成绩。 (高级研究:你可以将这两个循环结合起来)
答案 2 :(得分:0)
我已经对您的代码进行了一些更改,并且它不会再崩溃了。为什么需要使用Test指针。我认为使用静态内存而不是动态内存是件好事。请检查
#include<iostream>
#include<cstring>
using namespace std;
struct Course
{
string Name;
int IdNumber;
int Tests[100];
int Average;
int courseGrade;
};
void Result(int,int );
int main()
{
cout<<"please enter number of test score ";
int testScore;
cin>>testScore;
int numberofStudents;
cout<<"please enter number of student there is ";
cin>>numberofStudents;
Result(numberofStudents,testScore);
}
void Result(int numberofStudents,int testScore)
{
const int Size=numberofStudents;
const int Size1=testScore;
Course *object=nullptr;
object=new Course[numberofStudents];
//object->Tests = new int[testScore];
for(int i=0;i<testScore;i++)
{
cin>>object[i].Tests[i];
}
}