2016-04-15 1 views
0

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

Ввод программы - сколько учеников и сколько оценок, затем я динамически создаю массив в соответствии с тем, сколько классов они хотят и сколько студентов есть.

Выход должен быть напечатан только для каждого ученика и класса, но я не думаю, что у меня возникнут проблемы с этим, динамическая память - это та часть, которую я не понимаю.

// Filename: pointers.cpp 
#include <string.h> 
#include <iostream> 
#include <sstream> 
using namespace std; 


struct Student 
{ 
    string name; 
    int id; 
    int* mark; 
    ~Student() 
{ 
    delete [] mark; 
    mark = NULL; 
}; 
}; 

void initStudent(Student* ptr, int markNum, int studentNum); // function prototype for initialization 
void sayStudent(Student* ptr, int markNum);  // function prototype for printing 

//*********************** Main Function ************************// 
int main() 
{ 
    int mark, studentNum; 
    Student stu;   // instantiating an STUDENT object 
    Student* stuPtr = &stu; // defining a pointer for the object 
    cout << "How many marks are there? "; 
    cin >> mark; 
    cout << "How many students are there?"; 
    cin >> studentNum; 
    Student* students = new Student[studentNum]; 

    initStudent(&stu,mark,studentNum);  // initializing the object 
    sayStudent(&stu,mark,studentNum);  // printing the object 
    delete [] students; 

return 0; 

} // end main 

//-----------------Start of functions----------------------------// 

void initStudent(Student* ptr, int markNum, int studentNum) 
{ ptr -> mark = new int[markNum]; 
    cout << "Enter Student Name :"; 
    cin >> ptr -> name; 
    cout << "Enter Student ID Number :"; 
    cin >> ptr -> id; 
    for (int i = 1; i <= markNum; i++) 
    { 
     cout << "Please enter a mark :"; 
     cin >> ptr -> mark[i-1]; 
    } 
} 

void sayStudent(Student* ptr, int markNum) 
{ 
    cout << "Student info:"<< endl ; 
    cout << "Name: " << ptr -> name << endl; 
    cout << "Id:" << ptr -> id << endl; 
    for (int i = 0; i < markNum; i++) 
    { 
     cout << "Mark " << i << ": " << ptr -> mark[i] << endl; 

    } 

} 
+2

Как насчет того, чтобы начать, указав первую ошибку? Если это не компиляция, это происходит не потому, что вы не освобождаете память - это происходит во время выполнения. –

+1

Утечки памяти не должны отображаться во время компиляции, вы имеете в виду исключения во время выполнения? – cehnehdeh

+1

'void sayStudent (Student * ptr, int markNum,)' <==, который даже не будет компилироваться. Обратите внимание на завершающий символ ','. Также не будет 'cin << studentNum' по нескольким причинам. – WhozCraig

ответ

1

Как указано выше, исключения, которые вы получаете, не потому, что у вас есть свободная память. Все компиляторы C++, о которых я знаю, не выбрасывают исключения утечки памяти, вам нужно включить это с помощью параметра командной строки (в некоторых компиляторах) или использовать другой инструмент (например, Valgrind). Вероятно, вы просто испытываете синтаксические ошибки. Вот очищено и фиксируется копия кода (не модернизированный):

// Filename: pointers.cpp 
#include <string.h> 
#include <iostream> 
#include <sstream> 
using namespace std; 


struct Student 
{ 

    string name; 
    int id; 
    int* mark; 
    int markNums; 
    Student(){ 

     cout << "Enter Student Name :"; 
     cin >> name; 
     cout << "Enter Student ID Number :"; 
     cin >> this -> id; 
     cout<<"Enter number of marks :"; 
     cin>>markNums; 

     mark = new int[markNums]; 
     for (int i = 0; i <= (markNums-1); i++) 
     { 
      cout << "Please enter a mark :"; 
      cin >> mark[i]; 
     } 



    } 
    ~Student() 
    { 
     delete [] mark; 
     mark = nullptr; 
    }; 
    void say() 
    { 
     cout << "Student info:"<< endl ; 
     cout << "Name: " << this -> name << endl; 
     cout << "Id:" << this -> id << endl; 

     for (int i = 0; i <(markNums); i++) 
     { 
      cout << "Mark " << i << ": " << this -> mark[i] << endl; 

     } 

    } 

}; 



//*********************** Main Function ************************// 
int main() 
{ 
    int studentNum; 

    cout << "How many students are there?"; 
    cin >> studentNum; 
    Student * stuPtr; 
    stuPtr=new Student[studentNum];// initializing the object 
    for (int i=0; i<=(studentNum);i++){ 
     (*(stuPtr+i)).say(); 

    } 
    delete [] stuPtr; 

    return 0; 

} // end main 

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