C'è voluto un po', ma alla fine credo di aver capito il problema: Ridichiari sempre registro. In questo modo lo sovrascrivi perdendo le stringhe (non l'oggetto, ma il "valore" ) visto che sono allocate nell'heap al contrario degli int che sono nello stack.
codice:
main (){
  ...
 while(getline (myfile, line)) {
      ...
      Register registro; // Lo dichiari ad ogni ciclo
      vettManipClass vettManipObject;
 }
...
 case 1 : {
            Register registro; // Lo ridichiari
            registro.print_student(cont);
            break; }
 case 2 : {
            cout << "Insert output file name: "; cin >> out_name;
            Register registro;  // Lo ridichiari anche qua
            registro.print_file(out_name);
            break; }
        case 3 : {
            cout << "Insert name surname grade : ";
            cin >> new_name >> new_surname >> voto;
            Register registro; // e qui
}
Dichiarali una sola volta all'inizio del main (non dentro un ciclo) e basta.

inoltre , non ti conviene tener traccia del numero degli studenti dentro Register?