окна, вызывающие переломный момент - PullRequest
0 голосов
/ 23 февраля 2012

Я пишу программу для задания по изучению указателей и управлению памятью. Выделение памяти для студента и курсов необходимо с оператором new в этом назначении, и программа, кажется, работает должным образом, но после того, как она печатает все, программа вылетает и говорит, что это вызвало точку останова. Любая помощь будет оценена.

Ошибка находится здесь, но я не уверен, что это значит /* verify block type */ _ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));

#include <iostream>
#include <string>
#include <iomanip>
using namespace std;

struct Student //Structs
    {
        string firstName, lastName, aNumber;
        double GPA;
    };
struct Course
    {
        int courseNumber, creditHours;
        string courseName;
        char grade;
    };

Student* readStudent();                                    // Function Prototypes
Course* readCourseArray(int&);
void computeGPA(Student *student, Course *courseArray, int coursesTaken);
void printSummary(Student *studentPTR, Course *courseArray, int courses);
int main()                                                //Main
{
    int courses = 0;
    Student *studentPTR = readStudent();
    Course *coursePTR = readCourseArray(courses);
    computeGPA(studentPTR, coursePTR, courses);
    printSummary(studentPTR, coursePTR, courses);


    delete studentPTR;
    delete coursePTR;
    system ("pause");
    return 0;
}

Student* readStudent()                                       // Read Student
{
    Student* student = new Student;
    cout<<"\nEnter students first name\n";
    cin>>student->firstName;
    cout<<"\nEnter students last name\n";
    cin>>student->lastName;
    cout<<"\nEnter students A-Number\n";
    cin>>student->aNumber;


    return student;
}

Course* readCourseArray(int &courses)                           //Read Courses
{
    cout<<"\nHow many courses is the student taking?\n";
    cin>>courses;
    const int *sizePTR = &courses;
    Course *coursePTR = new Course[*sizePTR]; 

    for(int count = 0; count < *sizePTR; count++)  //Enter course information
    {
        cout<<"\nEnter student "<<count+1<<"'s course name\n";
        cin>>coursePTR[count].courseName;
        cout<<"\nEnter student "<<count+1<<"'s course number\n";
        cin>>coursePTR[count].courseNumber;
        cout<<"\nEnter student "<<count+1<<"'s credit hours\n";
        cin>>coursePTR[count].creditHours;
        cout<<"\nEnter student "<<count+1<<"'s grade\n";
        cin>>coursePTR[count].grade;
    } 


    return coursePTR;
}


void computeGPA(Student *studentPTR, Course *courseArray, int coursesTaken)             // Compute GPA
{
    double total = 0, hours = 0;
    for(int count = 0; count < coursesTaken; count++)
    {
        hours += courseArray[count].creditHours;
        if (courseArray[count].grade == 'A')
            total+=4;
        else if (courseArray[count].grade == 'B')
            total+=3;
        else if (courseArray[count].grade == 'C')
            total+=2;
        else if (courseArray[count].grade == 'D')
            total+=1;
        else if (courseArray[count].grade == 'F')
            total+=0;
    }
    studentPTR->GPA = (total / hours);
}


void printSummary(Student *studentPTR, Course *courseArray, int courses)
{
    cout<<"\nReport\n";
    cout<<"\nNumber   Name                    Hours  Letter Grade  Point Grade";  
    cout<<"\n------   ----                    -----  ------------  -----------\n";
    for(int count = 0; count < courses; count++)
         cout<<setw(3)<<courseArray[count].courseNumber<<"   "<<courseArray[count].courseName<<setw(20)<<"   "<<courseArray[count].creditHours<<setw(5)<<"  "<<courseArray[count].grade<<endl;

    cout<<"\nStudent :"<<studentPTR->firstName<<" "<<studentPTR->lastName;
    cout<<"\nA-Number :"<<studentPTR->aNumber;
    cout<<"\nOverall GPA :"<<studentPTR->GPA;
}

Ответы [ 2 ]

2 голосов
/ 23 февраля 2012

Вы выделяете курсы с оператором new [] (для массивов), но освобождаете его с помощью оператора delete вместо оператора delete [].

Вы должны освободить его так:

delete[] coursePTR;

Я также не понимаю, почему вы используете указатель sizePTR вместо непосредственного использования courses.

Кстати, просто чтобы вы знали, это не сайт "найди мою ошибку". У вас есть сайт для проверки кода.

2 голосов
/ 23 февраля 2012

Вам нужно изменить

delete coursePTR;

на

delete [] coursePTR;

. Всегда нужно использовать новое с удалением, а новое [] с удалением [], в противном случае могут случиться плохие вещи.1007 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...