Salve a tutti,innanzi tutto mi scuso perchè 2-3 giorni fa ho postato questa discussione su un altro forum ma non ho ricevuto nessuna risposta nonostante le visualizzazioni e quindi spero che dopo due-quasi tre giorni non si parli di crossposting. Vi propongo quindi la stessa discussione con alcune aggiunte,spero vivamente in un vostro aiuto.
Mentre preparavo il tema d'anno per l'esame di c++ mi sono scontrato con alcuni concetti che non mi sono ben chiari riguardo Vector, l'utilizzo di delete e il costruttore di copie.
In pratica ho creato una classe studente che deriva da persona, nel main ho poi dichiarato un "vector<classe>" in cui memorizzare i miei studenti.
Nella classe studente ho dichiarato "*voto=new int[3]"a mio avviso solo per poter inserire nel tema d'anno il costruttore di copie (effettivamente non so se è il modo giusto per mostrare al mio docente che effettivamente ho capito come funzione il cotruttore di copie). Alla fine ho messo nel distruttore della classe studente "delete[] voto".
Di seguito riporto il codice, a valle del quale vi espongo altri miei dubbi.
#include "stdafx.h"
#include <vector>
#include <iostream>
using namespace std;
class persona
{
protected:
char cognome[20];
char nome[20];
char temporaneo[20];
char temporaneo_pass[20];
int i;
public:
persona(){ };
~persona(){}
int accedi();
void registrati();
void acquisisci();
};
class studente :public persona
{
private:
int matricola;
int tempmatricola;
FILE*FS;
int *voto = new int[3];
public:
int contastudenti;
studente(const studente&, const vector<studente>&);
studente();
~studente(){ printf("\nDISTUTTORE); delete[]voto;};
void registrati(vector<studente>&, studente);
void acquisisci(vector<studente>&, studente&);
};
studente::studente(const studente& A, const vector<studente>& utenteS)
{
printf(" COSTRUTTORE DI COPIE :)");
voto = new int[3];
for (i = 0; i < contastudenti; i++)
{
voto[0] = utenteS[i].voto[0];
voto[1] = utenteS[i].voto[1];
voto[2] = utenteS[i].voto[2];
}
};
studente::studente()
{
printf("Ho costruito tutte le informazioni riguardo lo studente!\n");
i = 0;
contastudenti = 0;
FS = fopen("accountstudenti.txt", "r+");
if (FS == NULL)
{
printf("FILE INESISTENTE");
}
else
{
while (fscanf(FS, "%s%s%d%d%d%d", temporaneo, temporaneo, &tempmatricola, &tempmatricola, &tempmatricola, &tempmatricola) != EOF)
{
contastudenti++;
}
}
fclose(FS);
};
void studente::registrati(vector<studente>& utenteS, studente S)
{
int i = -1;
utenteS.push_back(S);
printf("\n---*REGISTRAZIONE*---\n");
printf("\nInserire NOME UTENTE:\n*");
scanf("%s", temporaneo);
do{
if (i >= contastudenti)
{
printf("Il nome utente E' VALIDO.");
printf("\nInserire PASSWORD:\n*");
scanf("%s", utenteS[contastudenti].cognome);
strcpy(utenteS[contastudenti].nome, temporaneo);
printf("\nInserisci la matricola:");
scanf("%d", &utenteS[contastudenti].matricola);
FS = fopen("accountstudenti.txt", "a+");
fprintf(FS, "%s %s %d %d %d %d\n", utenteS[contastudenti].nome, utenteS[contastudenti].cognome, utenteS[contastudenti].matricola, utenteS[contastudenti].voto[0] = 0, utenteS[contastudenti].voto[1] = 0, utenteS[contastudenti].voto[2] = 0);
fclose(FS);
contastudenti = contastudenti + 1;
break;
}
i++;
} while ((strcmp(utenteS[i].nome, temporaneo)) != 0);
}
void studente::acquisisci(vector<studente>& utenteS, studente& S)
{
int i = 0;
int n = 0;
if (contastudenti == 0)
{
printf("\nNON CI SONO SALVATI STUDENTI NEL DATABASE\n");
exit;
}
else{
FS = fopen("accountstudenti.txt", "r");
for (i = 0; i < contastudenti; i++)
{
fscanf(FS, "%s%s%d%d%d%d", utenteS[i].nome, utenteS[i].cognome, &utenteS[i].matricola, &utenteS[i].voto[0], &utenteS[i].voto[1], &utenteS[i].voto[2]);
}
fclose(FS);
}
}
void main()
{
studente S;
std::vector<studente> V(S.contastudenti);
S.acquisisci(V, S);
S.registrati(V, S);
system("pause");
}
Tralasciando l'IBRIDO tra C e C++, vorrei capire perché quando accedo nella funzione registrati (perché vado out of scope?) parte il distruttore, e perchè appena il programma arriva alla fine del main mi dà l'errore "_block_type_is_valide"?(errore che sembra essere del costruttore di copie e quindi sicuramente vado ad eliminare qualche area di memoria già prima eliminata).
Togliendo il "delete[]voto" il programma funziona! Resta il fatto che il distruttore parte appena accedo nella funzione "registrati()"(sarà forse per il pushback a cui passo la classe). Vi chiedo gentilmente una spiegazione perché sicuramente mi manca qualche nozione di teoria ma leggendo manuali non riesco a trovare risposte legate a queste problematiche.