Programa freez/loop [cerrado]

Encontré el siguiente problema y no recibo ninguna advertencia ni error, solo un bloqueo del programa.

Cuando corro en mi menú printAll() después de dummyData() inicialización En el momento en que agrego un nuevo estudiante, simplemente comienza a repetirse studentMenu().

Dominio.h:

template <class T>
struct Array{
    int length;
    T * M;

    Array( int size ) : length(size), M(new T[size])
    {
    }
    ~Array()
    {
       delete[] M;
    }
};

template <class T>
struct Array{
    int length;
    T * M;

    Array( int size ) : length(size), M(new T[size])
    {
    }
    ~Array()
    {
       delete[] M;
    }
};

template <class T>
void addStudent(int a, int b, std::string c,Array <T> A){
    A.M[a].setStudent(a,b,c);
}

template <class T>
void DummyDataStudents(Array <T> A){
    for(int i=1; i<15; i++){
        A.M[i].setStudent(i, i,"student");
    }
    cout<<"Done Students"<<endl;
}

Controlador.h

template <class T>
void _addStudent(Array <T> &A){
    int a,b;
    string c;
    cout<<"Enter ID:"<<endl;
    cin>>a;
    cout<<"Enter Group:"<<endl;
    cin>>b;
    cout<<"Enter Name:"<<endl;
    cin>>c;

    addStudent(a,b,c,A);
}

Estudiante.cpp:

void Student::setStudent(int a,int b,string c){

this->ID = a;
this->group = b;
this->name = c;
}

Menú.cpp:

void Menu::mainMenu(Array <Student> &DBst,Array <Assignment> &DBas){
showMainMenu();
int ret = Menu::intInputHandler();

switch(ret){
case 1:studentMenu(DBst,DBas);break;
case 2:assignmentMenu(DBst,DBas);break;
case 3:statsMenu(DBst,DBas);break;
case 4:_printAll(DBst,DBas);break;
case 0:break;
default:cout<<"Wrong option selected!";break;
}
Menu::mainMenu(DBst,DBas);
}



void Menu::studentMenu(Array <Student> &DBst,Array <Assignment> &DBas){
    showStudentMenu();
    int ret = Menu::intInputHandler();

    switch(ret){
    case 1:_addStudent(DBst);break;
    case 2:break;
    case 3:break;
    case 4:break;
    case 5:_printAllStud(DBst);break;
    case 6:break;
    case 0:mainMenu(DBst,DBas);break;
    default:cout<<"Wrong option selected!";break;
    }
    Menu::studentMenu(DBst,DBas);
}

Principal.cpp:

int main(){
//Main function of the program

    DummyDataStudents(DBst);

    DBst.M[10].setStudent(1,10,"sadasd");     //works just fine
    DBst.M[10].printStudent();cout<<endl;

    Menu main;      
    main.mainMenu(DBst,DBas);

    DBst.~Array();
    DBas.~Array();

    return 0;
}

///Creo que esto debería ser suficiente para entender. Cuando agrego un nuevo estudiante, obtengo bucles de impresión del menú hasta que falla; si llamo printall() Tengo un accidente directamente. Por favor ayuda y perdón por el código largo.

preguntado el 03 de mayo de 12 a las 16:05

¿Qué has hecho para tratar de depurar tu código? -

1 Respuestas

Esto es un problema:

template <class T> void addStudent(int a, int b, std::string c,Array <T> A){

La Array A se pasa por valor, por lo que se está copiando, lo que significa que ahora hay dos instancias de Array apuntando a la misma matriz interna M ya que no hay un constructor de copia definido para Array por lo que se genera un constructor de copia predeterminado. Cuándo addStudent() devuelve la matriz interna M está siendo eliminado por la instancia de Array local a la función. Esto deja la instancia restante de Array A con un puntero colgando.

Implemente un constructor de copia y un operador de asignación (que no creo que quiera hacer) o haga Array no copiable declarar el constructor de copia y el operador de asignación private.

contestado el 03 de mayo de 12 a las 16:05

Madre del dulce jesús :)) estoy cansada de haber estado con los ojos en el programa por tanto tiempo... ¡gracias! perdí 3 h de mi tiempo por una maldita referencia '&': <gracias de nuevo. Una mente fresca siempre es útil. - bogdan maier

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.