PDA

View Full Version : [C++] Problema distruttori


HyperText
01-01-2010, 15:04
Salve,

ho queste 2 classi:


// 1° classe
class Partita {
char * SquadraA;
char * SquadraB;

public:
[...]
~Partita ( ) { cout << "distruttore PARTITA" << endl; delete [] SquadraA; delete [] SquadraB; };
};

// 2° classe
class Lista
{
Nodo * testa;

public:
[...]
~Lista ( ) {
Nodo * aux = testa;

while ( testa )
{
cout << "distruttore LISTA" << endl;
aux = testa;
testa = testa->Nptr; // puntatore al prossimo Nodo
delete aux;
}
}
};


Il problema sorge quando cerco di eseguire questo codice:

Lista * L = new Lista;
Partita P;
L.inserisciPartita ( P ); // inserisco una Partita nella Lista
delete L;

E' proprio "delete L;" che mi fa crashare il programma.
Ma i costruttori son scritti giusti?
Il risultato che mi stampa è:

distruttore LISTA
distruttore PARTITA

e crasha.
cosa c'è che non va nei distruttori?

Ah, se ometto quel "delete L;" il programma termina correttamente.


Grazie


:ciauz:

cionci
01-01-2010, 18:52
testa = testa->Nptr; // puntatore al prossimo Nodo

e se testa è NULL ?

HyperText
01-01-2010, 18:57
Il while dovrebbe fermarsi e quindi non potrebbe eseguire "delete NULL;"... o no? :o

tomminno
01-01-2010, 18:57
Hai provato ad eseguire il programma in debug?

E comunque come inizializzi Nptr?
Perchè ho il vago sospetto che non lo imposti a NULL e quindi il while(testa) non si fermi fino a che non vai a cancellare qualcosa di errato.

HyperText
01-01-2010, 19:16
Però ho provato lo stesso ciclo per la stampa degli elementi nella Lista e funziona perfettamente...
Non dovrebbe essere lo stesso anche per il distruttore?

o4.
01-01-2010, 21:59
I distruttori non dicono molto senza le parti dove allochi e assegni quei campi, dovresti postare anche quelle

cionci
02-01-2010, 08:31
Il while dovrebbe fermarsi e quindi non potrebbe eseguire "delete NULL;"... o no? :o
Sì, in effetti.

Comunque mancano anche gli altri pezzi di codice. Potrebbe essere altrove il problema.

HyperText
02-01-2010, 10:21
Ragazzi,

ma se ho ad esempio:

struct Nodo
{
Nodo * next;
int elemento;
};


Questa struct viene allocata dinamicamente:

Nodo * q = new Nodo;


Se faccio "delete q;" mi cancella sia la variabile intera "elemento", sia la variabile puntatore "next".
Ma non è che mi cancella anche l'area di memoria puntata da "next"?

Perchè potrebbe essere questo il problema...

cionci
02-01-2010, 10:25
Non te la cancella l'area puntata da next.

HyperText
02-01-2010, 12:25
Pochi minuti fa mi è venuta l'illuminazione ed ho risolto overloadando l'operatore di assegnazione della classe Partita:
const Partita & operator = ( const Partita & P );

Praticamente prima mi assegnava l'indirizzo della variabile e non effettuava una vera e propia copia.
Quindi deallocando la variabile "da cui proveniva" e poi rieseguendo il delete della stessa variabile (dal distruttore) crashava perchè già eliminata.

Non so se mi son spiegato bene :(


Grazie :D