C ++ struct指针和内存泄漏

时间:2014-08-01 18:07:38

标签: c++ arrays memory-leaks

我正在做一个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后程序崩溃

3 个答案:

答案 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];
      }
}