【问题标题】:C++ struct pointer and memory leakC++结构指针和内存泄漏
【发布时间】:2014-09-25 00:08:32
【问题描述】:

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

【问题讨论】:

  • 你的意见是什么?
  • 你打电话给new。你永远不会打电话给delete
  • 您只为object 数组的第一个元素分配Tests,使用此行:`object->Tests = new int[testScore];`。
  • 请提供一些示例输入,以便我们更好地为您提供帮助。
  • 除了内存泄漏之外(有几个),您需要为学生设置一个外循环,然后为每个学生的考试成绩设置一个内循环。您对学生和单个循环的分数使用相同的索引i,这样做会执行一些“对角线”总体(第一个学生

标签: c++ arrays memory-leaks


【解决方案1】:

这是我怀疑正在发生的事情:

在这个for 循环中:

  for(int i=0;i<testScore;i++)
  {
       cin>>object[i].Tests[i];
  }

您使用testScore 作为索引访问object。如果testScore 大于object 的长度,您将遇到问题。

内存泄漏问题源于您为objectTests 的每个Tests 成员分配空间,但您从未释放该内存。

【讨论】:

  • 谢谢!我不清楚在哪里以及如何释放内存
  • Results() 的末尾,您需要遍历object 中的每个元素并调用类似delete object[i].Tests 的内容。然后在该循​​环完成后,您必须调用delete[] object
【解决方案2】:

存在内存泄漏,因为您使用 j new 分配东西,而从未使用 delete 释放它们。

至于崩溃,是由这一行引起的:

  object->Tests = new int[testScore];

请记住,object 不是 Course 对象,它是 Course 对象的数组,每个对象都需要它自己的 Tests 数组。该行实际上只是object[0].Tests = ...

因此,您需要在numberofStudents 上进行一个循环来分配每个课程中的测试,并在numberofStudents 上的另一个循环在testScore(您已经拥有)上的循环周围收集所有成绩。 (进阶学习:你可以结合这两个循环)

【讨论】:

    【解决方案3】:

    我对您的代码进行了一些更改,它不再崩溃。为什么需要使用 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];
          }
    }
    

    【讨论】:

    • 为什么您从已接受的答案中不接受此答案?问题是什么?能详细点吗?
    猜你喜欢
    • 2013-10-31
    • 2015-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-18
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    相关资源
    最近更新 更多