2

addStudent関数とmainMenu関数は重要な2つです。

#include <iostream>
#include <string>

using namespace std;

struct Student
{
   string name;
   string major;
   Student *p_next;
};

Student *addStudent(Student *p_students)
{
   Student *p_new_student = new Student;
   cout << "Student name: \n";
   cin >> p_new_student->name;
   cout << p_new_student->name << "'s major: \n";
   cin >> p_new_student->major;

   Student *p_place_holder = new Student;
   Student *p_all_students = new Student;
   p_all_students = p_students;
   p_place_holder = NULL;

   if (p_students == NULL) // Adds the first element to the linked list which was initialized to NULL
   {
      p_new_student->p_next = p_students;
      delete p_place_holder;
      delete p_all_students;
      return p_new_student;
   }

   else // Adds elements beyond the first element to the linked list
   {
      while (p_all_students != NULL)
      {
         if (p_new_student->name.compare(p_all_students->name) <= 0)
         {
            if (p_place_holder == NULL) /* if p_new_student->name is before
            p_all_students->name and p_all_students is still the first element in the list*/
            {
               p_new_student->p_next = p_all_students;
               p_all_students = p_new_student;
               delete p_place_holder;
               return p_all_students;
            }

            else
            {
               p_new_student->p_next = p_all_students;
               p_place_holder->p_next = p_new_student;
               return p_students;
            }

         }

         else if (p_new_student->name.compare(p_all_students->name) > 0)
         {
            p_place_holder = p_all_students;
            p_all_students = p_all_students->p_next;
         }
      }
   }
}

void mainMenu(Student *p_students)
{
   int response = 0;
   cout << "1. Add Student\n";
   cout << "2. View Students\n";
   cin >> response;

   if (response == 1) // calls addStudent 4 times and then mainMenu
   {
      p_students = addStudent(p_students);
      p_students = addStudent(p_students);
      p_students = addStudent(p_students);
      p_students = addStudent(p_students);
      mainMenu(p_students);
   }

   else if (response == 2) // lists the students and their majors and then exits
   {
      while (p_students != NULL)
      {
         cout << p_students->name << '\n';
         cout << p_students->major << "\n\n";
         p_students = p_students->p_next;
      }
   }

   delete p_students; // hopefully deletes all allocated memory
}

int main()
{
   Student *p_students = new Student;
   p_students = NULL;

   mainMenu(p_students);
}

基本的に「p_studentsを削除する」かどうか疑問に思います。mainMenu関数で、プログラムがメモリをリークしないように、割り当てられたすべてのメモリを適切に削除します。どんな助けでもありがたいです、どうもありがとう。

4

2 に答える 2

6

これらの行は、Studentのインスタンスをリークします。

Student *p_place_holder = new Student;
Student *p_all_students = new Student;
p_all_students = p_students;
p_place_holder = NULL;

Studentを割り当て、に割り当て、p_place_holder後でインスタンスを削除せずにポインタをNULLで上書きします。

あなたも持っています:

p_students = addStudent(p_students);
p_students = addStudent(p_students);
p_students = addStudent(p_students);
p_students = addStudent(p_students);

p_studentsこれは、古い値のメモリを解放しようとせずに3回上書きします。

より大きな問題は、で終わることですがdelete p_studentsStudent構造を調べてその中のポインターを見つけたり、削除したりすることはできません。割り当てたメモリのほとんどすべてがリークしています。

ペアを一緒に削除する方法を誤解していると思います。

于 2012-05-13T19:44:12.983 に答える
0

unique_ptrメモリリークを回避するために、強制所有権ポインタを使用する必要があります。たとえば、、shared_ptr。でリークを効果的に防ぐことはできませんdelete

于 2012-05-13T19:47:54.933 に答える