Newsgroup: it.comp.lang.c++
Titolo: Chiarimento

Se ho un array di char* allocati dinamicamente (x es: char **p), per
deallocarli è sufficiente fare:
delete [] p;
dico bene oppure erro?


Per ogni new ci vuole una delete, per ogni new[] ci vuole una delete[].
Quello che allochi esplicitamente, devi deallocare esplicitamente.
Ciao,
Nicola


wrote:

"delete[] p" dealloca l'array di puntatori, ma non degli oggetti
puntati... es...
   // Allocazione
   char **p=new char *[20]; // Alloca puntatori
   for (int i=0; i<20; i++)
     p[i]=new char [40]; // Alloca i-esima riga
   ...
   // Deallocazione
   for (int i=0; i<20; i++)
     delete[] p[i]; // Dealloca i-esima riga
   delete[] p; // Dealloca puntatori
Per evitare problemi di memory leak di solito in C++ si
preferiscono entita' piu' "intelligenti" come container e
smart pointer ai semplici puntatori (questi ultimi sono
spesso citati con il nome di "naked pointer").
HTH
Andrea
--
Andrea Griffini, Programmer
http://www.netservers.com/~agriff

    delete[] p; // Dealloca puntatori
In effetti inizialmente avevo usato la stessa procedura, ma al momento della
deallocazione si blocca tutto. Com'è stà storia?


Difficile dirlo senza dare un'occhiata al codice.
Se ritienti di aver impiegato la stessa tecnica indicata da Andrea e di
aver riscontrato un comportamento inaspettato ("si blocca tutto"), prepara
una versione minima e compilabile che riproduca lo stesso problema e
postala qui.
Max

E' una cosa del genere:
#include <string.h>
#include <iostream.h>
void main(){
    char a[3][10];
    strcpy(a[0],"uno");
    strcpy(a[1],"due");
    strcpy(a[2],"tre");
    char **p=new char *[3];
    for (int i=0; i<3; i++) {
    p[i]=new char [40];
    p[i]=a[i];                        <--- devo forse usare strcpy?
    }
    for (int i=0; i<3; i++)
        delete[] p[i];
    delete[] p;
}
Dov'è l'errore?

    p[i]=a[i];                        <--- devo forse usare strcpy?
Esattamente. Con l'istruzione che hai scritto semplicemente fai
puntare p[i] alla stessa area di a[i]. Questo genera due problemi:
  1) La memoria che avevi allocato per p[i] e' "smarrita"
     visto che con questa istruzione elimini l'unica variabile
     che conteneva l'indirizzo restituito da new.
  2) Al momento della deallocazione fai la delete[] di qualcosa
     che non era stato ottenuto con new[] (fai delete[] passando
     l'indirizzo dell'array a[i] allocato sullo stack)
Usando strcpy fai una cosa completamente diversa: p[i] mantiene
il suo valore e a quell'indirizzo vengono copiati i caratteri
contenuti nell'array a[i].


 Dov'è l'errore?
Non forse devi.
Facendo p[i] = a[i]; ottieni due puntatori che puntano la stessa area di
memoria (niente di
male se pero' ne tieni conto) e quindi quando poi deallochi p[i],  a[i] si
trova a puntare
area di memoria non valida qui in realta' e' molto peggio p[i] punta memoria
che in realta' e' sullo stack!!!!!!!
E per finire non hai + il modo di recuperare la memoria allocata con new
char[40];
Spero di non essere stato frettoloso nell'analisi.
Puoi fare p[i] = a[i]  senza preoccuparti di gestire l'area di memoria
puntata da p[i];
-- 
Posted from [194.214.173.28] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 puntata da p[i];
penso che il programma non ha molto senso, non per quello che svolge, ma
perchè in C++ c'è la classe string che ci risparmia tempo e fatica con i
lavori sulle stringhe. gli array di char (utilizzati come rappresentazione di
una stringa di testo) possono essere utili giusto per delle stringhe costanti.
[imho...]
--
ciao
xaero

 xaero
E fai il reply a me ?
---
Gaetano.


 una stringa di testo) possono essere utili giusto per delle stringhe
costanti.
Il programma ha senso se uno vuole imparare a programmare (come nel mio
caso). Ciao
Cecco.