PDA

Visualizza la versione completa : [C++] Uso intelligente del distruttore


amancalion
30-01-2009, 16:25
Ciao,
vi descrivo il mio problema: ho tanti oggetti dello stesso tipo, che per chiarezza chiamo A, che al loro interno, oltre a puntatori ad array allocati dinamicamente, hanno un puntatore ad una struttura dati condivisa B.

Non riesco a scrivere un distruttore per eliminare questi oggetti A in modo intelligente e lasciare intatta la struttura condivisa B.

La mia soluzione (sbagliata) prevede di chiamare, nel distruttore di A, la delete solo sui puntatori degli array dinamici.
Il mio problema che quando tento di cancellare un array di oggetti di tipo A, a runtime mi viene fuori un Abort

E' sbagliata l'interpretazione dell'uso del distruttore???? :confused:

In attesa di una risposta grazie

oregon
30-01-2009, 16:28
Mi sono perso ...

Giusto fare la delete di cio' che hai allocato dinamicamente ... ma non vedo piu' B nel tuo ragionamento ...

Per quanto riguarda l'errore, che intendi con un "Abort"?

amancalion
30-01-2009, 16:44
Grazie per la risposta

Allora ho implementato il distruttore dell'oggetto di tipo A con la speranza di non cancellare la struttura dati B. Quando uso il tipo A, per come il mio algoritmo, mi ritrovo a cancellare un vettore di oggetti di tipo A. Quando tento di farlo, mi cancella il primo oggetto del vettore (lo vedo perch ho un cout nel distruttore) e poi mi da un' abort a runtime.

Non conosco le cause dell'abort. Penso sia causato dal tentativo di cancellazione del secondo elemento. Ho pensato inoltre che se fosse cos, il problema potrebbe essere che con il primo oggetto sia stata concellata anche la struttura B.

amancalion
30-01-2009, 17:02
provo a postare un po' di codice



Bicluster *b = new Bicluster[2];
b[0] = Bicluster(&m, 0);
b[1] = Bicluster(&m, 1);

delete [] b;


Dove com &m la mia struttura dati condivisa. Quando cancello il vettore mi viene fuori

Deleting bicluster #0
Deleting bicluster #1
Deleting bicluster #1
Aborted

Ora Deleting bicluster# una stampa dentro il construttore. La cosa strana che ho solo due elementi nel vettore ed ho tre stampe e poi l'abort
:confused:

Stoicenko
30-01-2009, 17:05
b intanto posta il codice del distruttore di a e le 2 strutture..

cmq se la struttura b condivisa allora dovrebbe almeno avere un contatore di riferimenti per sapere se possibile deallocarla o meno..
nel distruttore di a decrementi il contatore e se 0 deallochi senn metti solo a null il puntatore..

Loading