PDA

View Full Version : [C++] dubbio con la delete


doomer
29-11-2008, 12:57
ho una situazione del genere:
classeA **p; //puntatore a puntatori
p=new classeA*[n]; //punta ad un array di dim. n di puntatori a classeA
for(int i=0;i<n;i++)
p[i]=new classeA(); //i puntatori puntano ad un oggetto
ora se volessi cancellare il tutto con la delete mi basterebbe fare:
delete []p;
oppure no?

PhysX
29-11-2008, 13:27
no, prima devi cancellare a mano gli oggetti di tipo classeA e poi l'array di puntatori, altrimenti gli oggetti di tipo classeA non vengono cancellati:

for(int i=0; i<n; i++) delete p[i];
delete[] p;


comunque è meglio evitare di gestire manualmente memoria allocata dinamicamente tramite puntatori in questo modo, piuttosto puoi usare shared_array di boost che si occupano di cancellare gli array quando non sono piu usati; nel tuo caso sarebbe:

shared_array<shared_ptr<classeA>> p(new shared_ptr<classeA>[n]);
for (int i=0; i<n; i++) p[i]=new classeA;

nel momento in cui l'array non è piu referenziato viene eliminato dal distruttore di shared_array, e anche gli ogetti di classeA che non sono piu referenziati da nessun altro vengono eliminati.

doomer
29-11-2008, 14:00
ok grazie

javaboy
29-11-2008, 14:16
Concordo meglio usare degli smart pointers.
Inoltre nel 99% dei casi è meglio usare un std::vector piuttosto che un array tradizionale.

fero86
29-11-2008, 15:22
Inoltre nel 99% dei casi è meglio usare un std::vector piuttosto che un array tradizionale. se non si ha a che fare con un array che cresce dinamicamente e sul quale non si debbano fare operazioni di sort, vector risulta solo un inutile overhead, o in tempo di compilazione o peggio ancora in runtime. gli array a dimensione fissa penso che convenga sempre allocarli staticamente.