Problema con Vector/Costr. di copie/delete

di il
3 risposte

Problema con Vector/Costr. di copie/delete

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.

3 Risposte

Devi accedere o registrarti per scrivere nel forum
3 risposte