PDA

View Full Version : [C++] Distruttore e operator=


Reflex86
15-07-2008, 16:50
Ciao ragazzi ho questo problema:

Object::~Object()
{
if(!vector.empty())
{
for(int i=0; i<vector.size(); i++)
delete vector[i];
vector.clear();
}
}


Object &Object::operator=(const Object &b)
{
if (this!=&b)
{
if(!vector.empty())
{
for(int i=0; i<vector.size(); i++)
delete vector[i];
vector.clear();
}
vector = b.vector;
}
return *this;
}


Specifico che si tratta di un vector<type*>, quindi devo deallocarlo a mano.

quando eseguo il programma inserendo una assegnazione nel main, il programma si esegue ma poi lancia una eccezione, come se andasse a togliere due volte lo stesso oggetto credo. Se invece provo a mettere i<vector.size() - 1 nel ciclo del distruttore, il problema non c'è. Idem se elimino il codice che dealloca i puntatori dalla funzione operator=

Ora mi chiedo: è giusta l'implementazione? cosa sbaglio?

grazie

71104
15-07-2008, 17:26
ma il debug...? ti lancia un'eccezione, embè? che IDE usi? non viene interrotto il programma quando viene lanciata l'eccezione? non hai la possibilità di analizzare il contenuto del vettore?

PS: le clear comunque sono inutili.

71104
15-07-2008, 17:27
altra cosa che mi viene in mente, non hai la possibilità di usare degli smart pointers per gestire gli oggetti contenuti nel vettore? inoltre, è proprio necessario allocarli dinamicamente e gestirli tramite puntatore?

Reflex86
15-07-2008, 17:29
uso devc++

fa una cosa strana, praticamente mi esegue il programma e arriva a system("pause") e si blocca, non capisco cosa può essere

cioè mi esce il risultato del programma tutto corretto, es:


prova
Premere un tasto per continuare....

in teoria dovrebbe chiudersi la finestra, invece premo e viene lanciata un'eccezione

ilsensine
16-07-2008, 09:27
...
vector = b.vector;

Double delete in arrivo.

Albi89
16-07-2008, 10:59
...
vector = b.vector;

Double delete in arrivo.

Vero mi era sfuggito :doh:
Devi copiare gli elementi del vettore con un ciclo e allocarli al momento, o punteranno entrambi allo stesso ;)

Reflex86
16-07-2008, 14:32
grazie mille, problema risolto :)