PDA

Visualizza la versione completa : [C++] Probabile errore di allocazione della memoria


00disaster00
22-01-2013, 19:14
Salve a tutti stavo realizzando una classe e come dato membro utilizzo un vettore di puntatori a oggetti; nel costruttore pongo i vari puntatori a 0 (o NULL) ed ecco qua che sorge l'errore: compila ed esegue ma poi "Il programma ha smesso di funzionare".
In un altro invece certe volte viene eseguito e certe volte termina la sua esecuzione (se non riesco a risolvere il problema posterò il codice). Ritornando al discorso iniziale vi posto il codice:


//Rete.h
#ifndef RETE_H
#define RETE_H
#include "Utente.h"
#include "Gruppo.h"

class Rete{

public:
Rete();
~Rete();
// void AddUtente();
//void AddGruppo();
// void IscriviUtenteGruppo();
// void ElencoIscrittiGruppo();
//void ElencoGruppiUtente();
private:
Utente* u[500];
Gruppo* g[500];
//int cercautente(long cd);
};

#endif

//Rete.cpp
#include "Rete.h"
#include "Utente.h"
#include "Gruppo.h"
#include <iostream>
using std::cin;
using std::cout;
using std::endl;

Rete::Rete()
{
for(int i=0; i<500; i++)
u[i]=0;
for(int i=0; i<500; i++)
g[i]=0;
}

Rete::~Rete()
{
for(int i=0; i<500; i++){
if(u[i]) delete u[i];
if(g[i]) delete g[i];
}
}


Il seguente codice invece non crea problemi:


//Gruppo.cpp
#include "Gruppo.h"
#include "Utente.h"
#include <string>
using std::string;
#include <iostream>
using std::cout;
using std::endl;
using std::cin;

Gruppo::Gruppo(string n, string dc): nome(n), data_creazione(dc)
{
for(int i=0; i<100; i++)
iscritti[i]=0;
}



dove iscritti è un array di puntatori a Utente.
Ringrazio in anticipo.
--

oregon
22-01-2013, 19:45
Probabilmente l'errore è causato da altro nel tuo codice. Bisognerebbe vederlo tutto, compilarlo ed eseguirlo.

00disaster00
22-01-2013, 21:04
appena possibile vedrò di postare tutti i codici..il programma è stato anche riassemblato più volte.
--

00disaster00
23-01-2013, 20:40
Posto i codici delle varie classi e dei file .cpp:


//Rete.h
#ifndef RETE_H
#define RETE_H
#include "Utente.h"
#include "Gruppo.h"

class Rete{

public:
Rete();
~Rete();
private:
Utente* u[500];
Gruppo* g[500];
int cercautente(long cd);
};

#endif

//Rete.cpp
#include "Rete.h"
#include "Utente.h"
#include "Gruppo.h"
#include <iostream>
using std::cin;
using std::cout;
using std::endl;

Rete::Rete()
{

for(int i=0; i<500; i++)
u[i]=0;
for(int i=0; i<500; i++)
g[i]=0;
}
Rete::~Rete()
{
for(int i=0; i<500; i++){
if(u[i]) delete u[i];
if(g[i]) delete g[i];
}
}


//Gruppo.h
#ifndef GRUPPO_H
#define GRUPPO_H
#include <string>
using std::string;
#include "Utente.h"

class Gruppo
{
friend ostream& operator<<(ostream& out, const Gruppo& g);
friend istream& operator>>(istream& in, Gruppo& g);

public:
Gruppo(string n="", string dc="");
~Gruppo();

private:
string nome, data_creazione;
Utente* iscritti[100];
};
#endif

//Gruppo.cpp
#include "Gruppo.h"
#include "Utente.h"
#include <string>
using std::string;
#include <iostream>
using std::cout;
using std::endl;
using std::cin;

Gruppo::Gruppo(string n, string dc): nome(n), data_creazione(dc)
{
for(int i=0; i<100; i++)
iscritti[i]=0;
}

Gruppo::~Gruppo()
{
for(int i=0; i<100; i++)
if(iscritti[i]) delete iscritti[i];
}


//Utente.h
#ifndef UTENTE_H
#define UTENTE_H
#include <string>
using std::string;
#include <iostream>
using std::istream;
using std::ostream;

class Utente
{
friend ostream& operator<<(ostream& out, const Utente& u);
friend istream& operator>>(istream& in, Utente& u);
public:
Utente(long cod=0, string n="", string c="", string mail="");
long GetCodice() const;
private:
long codice;
string nome, cognome, email;

};
#endif

//Utente.cpp
#include "Utente.h"
#include <iostream>
using std::cout;
using std::endl;
#include <string>
using std::string;

Utente::Utente(long cod, string n, string c, string mail): codice(cod), nome(n), cognome(c), email(mail) { ; }

long Utente::GetCodice() const { return codice; }


ostream& operator<<(ostream& out, const Utente& u)
{
cout<<u.codice<<" "<<u.nome<<" "<<u.cognome<<" "<<u.email<<endl;
return out;
}
istream& operator>>(istream& in, Utente& u)
{
cout<<"Inserisci codice: ";
in>>u.codice;
cout<<"Inserisci nome: ";
in>>u.nome;
cout<<"insrisci cognome: ";
in>>u.cognome;
cout<<"Inserisci mail: ";
in>>u.email;

return in;
}


//main.cpp
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
#include "Rete.h"

void menu();

int main()
{
Rete r;
while(true){
char c;
menu();
cin>>c;
/* switch(c){
case 'a':
r.AddUtente();
break;
case 'b':
r.AddGruppo();
break;
case 'c':
r.IscriviUtenteGruppo();
break;
case 'd':
r.ElencoIscrittiGruppo();
break;
case 'e':
r.ElencoGruppiUtente();
default:

cout<<"Nessuna scelta inserita"<<endl;
break;
}*/
}
system("PAUSE");
return 0;
}

void menu()
{
cout<<"a) aggiungi utente"<<endl;
cout<<"b) aggiungi gruppo"<<endl;
cout<<"c) iscrivi utente a gruppo"<<endl;
cout<<"d) stampa elenco iscritti a gruppo"<<endl;
cout<<"e) stampa elenco gruppi per l'utente"<<endl;
}

oregon
23-01-2013, 20:46
E quando hai problemi?

00disaster00
23-01-2013, 21:38
appena eseguo il programma. viene compilato, ma appena lo eseguo appare la console e subito va in crash.

oregon
23-01-2013, 21:40
A me, no.

00disaster00
24-01-2013, 08:59
a me già così crashava, comunque ti posto tutti i codici delle classi che fino a 2 minuti fa crashavano e ora non più:


#include <iostream>
using std::cin;
using std::cout;
using std::endl;
#include "Rete.h"

void menu();

int main()
{
Rete r;
while(true){
char c;
menu();
cin>>c;
switch(c){
case 'a':
r.AddUtente();
break;
case 'b':
r.AddGruppo();
break;
case 'c':
r.IscriviUtenteGruppo();
break;
case 'd':
r.ElencoIscrittiGruppo();
break;
case 'e':
r.ElencoGruppiUtente();
default:

cout<<"Nessuna scelta inserita"<<endl;
break;
}
}
system("PAUSE");
return 0;
}

void menu()
{
cout<<"a) aggiungi utente"<<endl;
cout<<"b) aggiungi gruppo"<<endl;
cout<<"c) iscrivi utente a gruppo"<<endl;
cout<<"d) stampa elenco iscritti a gruppo"<<endl;
cout<<"e) stampa elenco gruppi per l'utente"<<endl;
}


//Gruppo.h
#ifndef GRUPPO_H
#define GRUPPO_H
#include <string>
using std::string;
#include "Utente.h"

class Gruppo
{
friend ostream& operator<<(ostream& out, const Gruppo& g);
friend istream& operator>>(istream& in, Gruppo& g);

public:
Gruppo(string n="", string dc="");
~Gruppo();
void AddUtente();
void StampaIscritti() const;
bool CercaUtente(long cd) const;

private:
string nome, data_creazione;
Utente* iscritti[100];
};
#endif

//Gruppo.cpp
#include "Gruppo.h"
#include "Utente.h"
#include <string>
using std::string;
#include <iostream>
using std::cout;
using std::endl;
using std::cin;

Gruppo::Gruppo(string n, string dc): nome(n), data_creazione(dc)
{
for(int i=0; i<100; i++)
iscritti[i]=0;
}

Gruppo::~Gruppo()
{
for(int i=0; i<100; i++)
if(iscritti[i]) delete iscritti[i];
}

void Gruppo::AddUtente()
{
for(int i=0; i<100; i++)
if(!iscritti[i]){
iscritti[i]=new Utente;
cin>>*iscritti[i];
return;
}
cout<<"Ragginto numero massimo di iscritti"<<endl;
}

void Gruppo::StampaIscritti() const
{
for(int i=0; i<100; i++)
if(iscritti[i]) cout<<*iscritti[i];
}

bool Gruppo::CercaUtente(long cd) const
{
for(int i=0; i<100; i++)
if(iscritti[i]){
if(iscritti[i]->GetCodice()==cd) return true;
}
return false;
}

ostream& operator<<(ostream& out, const Gruppo& g)
{
out<<g.nome<<" creato il "<<g.data_creazione<<endl;
return out;
}

istream& operator>>(istream& in, Gruppo& g)
{
cout<<"Inserisci il nome del gruppo: ";
in>>g.nome;
cout<<"Inserisci la data di creazione: ";
in>>g.data_creazione;
return in;
}

//Utente.h
#ifndef UTENTE_H
#define UTENTE_H
#include <string>
using std::string;
#include <iostream>
using std::istream;
using std::ostream;

class Utente
{
friend ostream& operator<<(ostream& out, const Utente& u);
friend istream& operator>>(istream& in, Utente& u);
public:
Utente(long cod=0, string n="", string c="", string mail="");
long GetCodice() const;
private:
long codice;
string nome, cognome, email;

};
#endif

//Utente.cpp
#include "Utente.h"
#include <iostream>
using std::cout;
using std::endl;
#include <string>
using std::string;

Utente::Utente(long cod, string n, string c, string mail): codice(cod), nome(n), cognome(c), email(mail) { ; }

long Utente::GetCodice() const { return codice; }


ostream& operator<<(ostream& out, const Utente& u)
{
cout<<u.codice<<" "<<u.nome<<" "<<u.cognome<<" "<<u.email<<endl;
return out;
}
istream& operator>>(istream& in, Utente& u)
{
cout<<"Inserisci codice: ";
in>>u.codice;
cout<<"Inserisci nome: ";
in>>u.nome;
cout<<"insrisci cognome: ";
in>>u.cognome;
cout<<"Inserisci mail: ";
in>>u.email;

return in;
}

//Rete.h
#ifndef RETE_H
#define RETE_H
#include "Utente.h"
#include "Gruppo.h"

class Rete{

public:
Rete();
~Rete();
void AddUtente();
void AddGruppo();
void IscriviUtenteGruppo();
void ElencoIscrittiGruppo();
void ElencoGruppiUtente();
private:
Utente* u[500];
Gruppo* g[500];
int cercautente(long cd);
};

#endif

//Rete.cpp
#include "Rete.h"
#include "Utente.h"
#include "Gruppo.h"
#include <iostream>
using std::cin;
using std::cout;
using std::endl;

Rete::Rete()
{
// for(int i=0; i<100; i++)
// u[i]=0;
for(int i=0; i<500; i++)
u[i]=0;
for(int i=0; i<500; i++)
g[i]=0;
}
Rete::~Rete()
{
for(int i=0; i<500; i++){
if(u[i]) delete u[i];
if(g[i]) delete g[i];
}
}
void Rete::AddUtente()
{
for(int i=0; i<5000; i++)
if(!u[i]){
u[i]=new Utente;
cin>>*u[i];
return;
}
cout<<"Non e' piu' possibile iscrivere utenti alla rete"<<endl;
}
void Rete::AddGruppo()
{
for(int i=0; i<500; i++)
if(!g[i]){
g[i]=new Gruppo;
cin>>*g[i];
return;
}
cout<<"Non e' piu' possibile iscrivere gruppi alla rete"<<endl;

}
void Rete::IscriviUtenteGruppo()
{
long cd;
cout<<"inserire codice utente: ";
cin>>cd;
int indice;
if((indice=cercautente(cd))>=0) {
cout<<*u[indice];
for(int i=0; i<500; i++)
{
if(g[i]){
char risp;
cout<<*g[i];
cout<<"vuoi iscriverti?(s/n) ";
cin>>risp;
if(risp=='s' || risp=='S')
g[i]->AddUtente();
}
}

}
}
void Rete::ElencoIscrittiGruppo()
{
for(int i=0; i<500; i++)
if(g[i]){
cout<<*g[i];
char risp;
cout<<"vuoi stampare gli iscritti?(s/n) ";
cin>>risp;
if(risp=='s' || risp=='S')
g[i]->StampaIscritti();
}
}
void Rete::ElencoGruppiUtente()
{
long cd;
cout<<"inserire codice utente: ";
cin>>cd;
for(int i=0; i<500; i++){
if(g[i]){
if(g[i]->CercaUtente(cd))
cout<<*g[i];
}
}

}

int Rete::cercautente(long cd)
{
for(int i=0; i<500; i++)
if(u[i]->GetCodice()==cd) return i;
cout<<"utente non presente"<<endl;
return -1;
}



bhu!.
Ciao e grazie per la disponibilità :ciauz:

Loading