Newsgroup: it.comp.java
Titolo: Puntatori, riferimenti e garbage...

Ho appena iniziato lo studio del Java(conosco C e C++) e ho dei dubbi:
1) come posso creare un riferimento o un puntatore(se possibile) ad un tipo
primitivo?
2) dato che non esistono puntatori ma solo riferimenti (che però agiscono in
modo simile a puntatori, da quanto ho capito, avendo classe di
memorizzazione) , e che un oggetto gestito tramite un riferimento è
automaticamente deallocato alla fine dello scope del primo, come si possono
creare strutture dati tipo liste concatenate, etc...?
3) un riferimento, può puntare a oggetti diversi. Ovvero, posso prima
assegnargli un oggetto e poi una ltro? Se possibile, come viene gestita la
deallocazione del primo?
Grazie
--
Marco Iannaccone     
marc...@tin.it
ICQ: 18748121           Tolkien
"I've... seen things you people wouldn't believe. Attack ships on fire off
the shoulder of Orion.
I watched C-beams... glitter in the dark near the Tanhauser Gate. All
those... moments will be lost... in time..., like... tears... in... rain."
FAQ it.comp.lang.c++: 
http://www.programmazione.it/linguaggi/c/lang_faq.htm
FAQ it.comp.lang.c: 
http://www.programmazione.it/linguaggi/c/itcomplangc.htm

 deallocazione del primo?
 La deallocazione "reale" dell'oggetto dalla memoria avviene in automatico
in modo non deterministico.


 deallocazione del primo?
Certo.
a = new MyClass();
b = new MyClass();
a = b;
Alla fine 'a' e 'b' puntano entrambi sullo stesso oggetto. Quello associato
inizialmente ad 'a' diventa garbage.
La deallocazione é gestita dal garbage collector che ogni tanto si attiva e
elimina le instanze inutilizzabili. L'algoritmo, senza entrare nei dettagli,
é il seguente: partendo dal "rootset", cioé l'insieme di referenze in scope
in un determinato momento, il garbage collector marca tutti gli oggetti che
incontra come accessibili. Quelli che restano non marcati sono quindi
inaccessibili e vengono poi recuperati.
bye
Carlo

 servono piů. La distruzione di un oggetto č affidata al garbage collector.
Se io ho un metodo che alloca ad esempio un nuovo nodo di una lisat o un
albero, etc..., e ne restituisce l'indirizzo, non viene deallocato
all'uscita della funzione? Potresti farmi un esempio di questo tipo, con
codice?
MyClass oggetto = new MyClass( 1 );
oggetto = new MyClass( 13 );
ovvero creo un riferiemnto che punta ad un oggetto di tipo MyClass creato
dinamicamente, poi allocao dinamicamente un altro oggetto dello steso tipo,
assegnando il suo indirizzo al riferimento precedente. Quindi ora non si
conosce piů l'indirizzo del primo oggetto. Come viene deallocato?


Grazie, sei sato chiarissimo!


 conosce più l'indirizzo del primo oggetto. Come viene deallocato?
Non esistono più accessi al primo oggetto ? Perfetto ! Il garbage collector,
quando sarà invocato dal run-time di Java, rilascerà la memoria allocata.
In modo invisibile al programmatore....


 writes:
MI> Se io ho un metodo che alloca ad esempio un nuovo nodo di una lisat o un
MI> albero, etc..., e ne restituisce l'indirizzo, non viene deallocato
MI> all'uscita della funzione? Potresti farmi un esempio di questo tipo, con
MI> codice?
No se qualcuno ha un riferimento all'oggetto.
MI> MyClass oggetto = new MyClass( 1 );
MI> oggetto = new MyClass( 13 );
MI> ovvero creo un riferiemnto che punta ad un oggetto di tipo MyClass creato
MI> dinamicamente, poi allocao dinamicamente un altro oggetto dello steso tipo,
MI> assegnando il suo indirizzo al riferimento precedente. Quindi ora non si
MI> conosce più l'indirizzo del primo oggetto. Come viene deallocato?
Viene deallocato QUANDO parte il thread del garbage collector che va a
fare un  giro per gli oggetti  creati nella VM e  controlla quelli che
non sono  raggiungibili da  nessun riferimento (è  una delle  cose che
Java ha  preso dal  LISP). Nota: è  possibile disabilitare  il garbage
collector. Ad un corso  Sun mi hanno detto che ci sono  casi in cui si
fa un  profiling della  memoria massima richiesta  dall'applicazione a
garbage  collector disabilitato  e  poi si  carrozza adeguatamente  la
macchina su cui gira.
\begin{avviso}
 
Attenzione: Leggersi lo header riguardo al mio e-mail!
Warning: read header for infos about my e-mail.
\end{avviso}
+----------------------------------------------------------------+
| Gian Uberto Lauri * "So, are you working on fixing that bug    |
| 
sa...@eng.it
      *  *now* or leaving it until later ?" - YES  |
+----------------------------------------------------------------+