Newsgroup: it.comp.programmare
Titolo: tenere aggiornato un registro di puntatori..

Ciao a tutti,
ho un problema in apparenza banale ma che forse e' un filo piu' complicato
del previsto e vorrei sapere se esiste qualche metodo standard per
risolverlo.
In pratica ho la seguente:
In run-time creo e distruggo tutta una serie di oggetti dello stesso tipo,
per tenere una traccia di tali oggetti (per deallocarli alla fine del
processo e per leggere le informazioni in essi contenute) definisco un
vettore di puntatori, un registro degli oggetti presenti in memoria.
Usando un vettore posso, da un lato incrementare "senza limiti" la lista e
dall'altro ho la sicurezza che sia sempre in forma "compatta" (posso
leggerelo sempre attraverso un normale ciclo sugli iteratori).
Il problema e' pero' come eliminare un puntatore dal vettore quando
l'oggetto viene deallocato!
Poiche nel frattempo avro' fatto latre operazioni di scrittura/rimozione,
non sapro piu' dove si trova il riferimento all'oggetto nel vettore.
Spero di essermi spiegato.
Faccio un esempio in metalinguaggio (SO che non compilerebbe..)
vector<oggetto*> lista_puntatori;
oggetto* crea_oggetto(){
        oggetto* oggetto_pt=new oggetto;
        lista_puntatori.push_back(oggetto_pt);
}
void distruggi_oggetto(oggetto* oggetto_da_eliminare){
        delete oggetto_da_eliminare;
        //-->e ora come elimino da lista_puntatori <--//
}
void leggi_lista_oggetti(){
        vector<oggetto*>::iterator iteratore;
        for(iteratore=lista_puntatori.begin() ; 
                iteratore!=lista_puntatori.end();iteratore++){
                        leggi_oggetto(lista_puntatori[iteratore]);
        }
}
Grazie

 Spero di essermi spiegato.
Buongiorno,
	sembra un problema di un garbage collector, il cui compito è quello di 
deallocare la memoria non più referenziata. Dato che tu non hai in C++ 
un garbage collector allora ti devi arrangiare :)
void distruggi_oggetto(oggetto* oggetto_da_eliminare){
         delete oggetto_da_eliminare;
         //-->e ora come elimino da lista_puntatori <--//
}
anche se distruggi l'oggetto con il delete, hai sempre il rif. 
all'istanza (anche se oramai perfettamente invalidata, e magari rimossa 
dall'heap dalle funzioni richiamate dal delete standard) che è il tuo 
identificatore nel vettore..
quindi non devi far altro che trovare nel vettore il tuo elemento e 
cancellarlo dalla lista...
antonio

Antonio Mazzeo wrote:

Ma e' proprio questo il problema...
Se ad ogni elemento eliminato dovessi andare a scorrere l'intero vettore per
cercare il puntatore e' finita in termini di prestazioni.
Cmq dalle risposte ottenute ho capito che non esiste un modo semplice ed
efficiente per tenerlo aggiornato, e, anche se avere un "bell vettore
pulito" che tenga tutte le istanze create sarebbe una cosa utile e
raffinata, in pratica il lavoro necessario per tenerlo aggiornato lo rende
una soluzione inefficiente.
Il fatto e' (ma ammetto di non averlo specificato nella prima mail) che ho
gia' un secondo puntatore all'oggetto creato (quindi il problema non e' la
deallocazione..) (in realta' ne ho diversi tutti sparsi in una griglia di
grandi dimensioni, in pratica tutti quelli che fanno parte dell'oggetto) ma
ottenere il riferimento all'oggetto in questo modo e' dispendioso (dovendo
andare a cercare i vari riferimenti in questa griglia tridimensionale di
circa 10^6 elementi) ma almeno posso farlo una sola volta (alla fine)
quindi mi sa che alla fine la strada senza vettore e' quella migliore.
Massimo

 Ma e' proprio questo il problema...
Allora forse è il caso di cambiare strategia.. non usare il vettore, 
magari un albero binario, una hashtable.. ordina il vettore in modo da 
ridurre la ricerca ad almeno metà vettore..
antonio