PDA

Visualizza la versione completa : [C++] operatore delete


oppid
12-05-2011, 01:13
Ciao ragazzi, gentilmente c'è qualcuno che mi da una mano a capire come funziona l'operatore delete in C++?
Integer è una classe semplice semplice che ha come data member un intero.
Quale è la giusta sequenza di delete???





Integer * p = new Integer(9);
Integer ** p2 = new Integer *;
Integer *** p3 = new Integer **;

p2 = &p;
p3 = &p2;




io farei:

delete p;
delete p2;
delete p3;

...ma ovviamente non va bene, perchè? :dhò:

YuYevon
12-05-2011, 07:23
Non ha senso quello che fai, l'unica allocazione dinamica che devi fare è su p che deve puntare ad un oggetto. p2 e p3 non devono puntare ad alcun oggetto ma devono solo contenere degli indirizzi (rispettivamente di p e di p2).

I tre puntatori p, p2 e p3 sono allocati staticamente. Quando vai ad allocare dinamicamente lo spazio per un oggetto per ogni puntatore, ne modifichi il valore ma poi dopo lo modifichi nuovamente facendo le assegnazioni

p2 = &p;
p3 = &p2;

cioè a p2 e a p3 assegni indirizzi di variabili statiche, in quanto p e p2 lo sono (non confondere l'indirizzo del puntatore con l'indirizzo contenuto dal puntatore), tant'è che se stampi i valori dei puntatori subito dopo l'allocazione dinamica e subito dopo l'assegnazione ti renderai conto che cambiano. Nel momento in cui richiami la delete su p2 e p3 quindi stai provando a deallocare memoria assegnata staticamente (quella per i puntatori) e hai un errore run-time.

Risolvi semplicemente non allocando nulla per p2 e p3 visto che non ne hai bisogno (in quanto a loro assegni solo degli indirizzi) e ovviamente non richiamando la delete su di loro.

oppid
12-05-2011, 11:26
mmm...ok.
E se volessi dichiarare un array bidimensionale di N x M puntatori a Integer, come potrei rilasciare la memoria?



Integer*** array3 = new Integer** [N];
for(int i = 0; i < M; i++)
{
array3[i] = new Integer* [M];
}

k = 1;

for(int i = 0; i<N; i++)
{
for(int j = 0; j<M; j++)
{
array3[i][j] = new Integer(k++);

}
}

cout << endl << endl;

//stampa matrice
for(int i = 0; i<N; i++)
{
for(int j = 0; j<M; j++)
{
cout << array3[i][j]->getInt() << endl;
}
}


//rilascio della memoria
for(int i = 0; i<N; i++)
{
for(int j = 0; j<M; j++)
{
delete array3[i][j]; //richiama il distruttore della classe Integer
}
}

for(int i = 0; i<M; i++)
{
delete [] array3[i];
}

delete [] array3; //ERRORE, perchè?

oppid
12-05-2011, 11:53
mi rispondo da solo perchè ho trovato l'errore.
Ho sbagliato un indice :shy: :shy:
Il codice funzionante è questo:



//new e delete con Integer array bidimensionale N x M di puntatori ad Integer


Integer*** array3 = new Integer ** [N];
for(int i = 0; i < N; i++) //QUI C'ERA L'ERRORE SULL'INDICE N
{
array3[i] = new Integer * [M];
//*(array3 + i) = new Integer* [M];
}

k = 1;

for(int i = 0; i<N; i++)
{
for(int j = 0; j<M; j++)
{
//array3[i][j] = new Integer(k++);
*(*(array3 + i) + j) = new Integer(k++);
}
}

cout << endl << endl;

//stampa matrice
for(int i = 0; i<N; i++)
{
for(int j = 0; j<M; j++)
{
cout << array3[i][j]->getInt() << endl;
//cout << (*(*(array3 + i) + j))->getInt() << endl;
}
}

for(int i = 0; i<N; i++)
{
for(int j = 0; j<M; j++)
{
delete array3[i][j];
}

delete [] array3[i];
}

delete [] array3;


:ciauz:

P.S. esiste un modo alternativo per alloccare un array bidimensionale di puntatori?

Loading