Newsgroup: it.comp.lang.c++
Titolo: Garbage collection

Qualcuno saprebbe spiegarmi cosa sia e a cosa serva (sempre che non sia una
domanda OT, nel qual caso mi scuso)? Grazie
Cecco

 domanda OT, nel qual caso mi scuso)? Grazie
In C++ non c'e'.
E' un meccanismo di richiamo della memoria dinamica. In C++ esistono sia le
variabili oggetto sia i puntatori sia le istanze. Puoi allocare dinamicamente un
oggetto e mantenerne l'indirizzo in un puntatore. Al termine dell'uso lo devi
disallocare esplicitamente.
In altri linguaggi (per esempio Smalltalk) non esistono ne i puntatori ne le
variabili oggetto. Esistono solo ed esclusivamente le reference. E una reference
e' sempre connessa ad un oggetto dinamico oppure e' nulla (come un puntatore
null del C++). Puoi allocare oggetti dinamicamente quando vuoi. Ma non puoi
deallocarli. Ci pensa la garbage collection.
Ci sono moltissimi diversi tipi di garbage collection. Ma tutti fanno
sostanzialmente la stessa cosa: deallocano gli oggetti dinamici che non servono
piu' (ovvero che non sono piu' puntati da nessuna reference).
--
Andrea Ferro
---------
Brainbench C++ Master. Scored higher than 97% of previous takers
Scores: Overall 4.46, Conceptual 5.0, Problem-Solving 5.0
More info 
http://www.brainbench.com/transcript.jsp?pid=2522556

Ti ringrazio per il chiarimento, ma c'è ancora qualche cosa che non mi è
chiaro. Mi sono andato a leggere, tanto per godere un pochino, lo
Stroustroup ("Il linguaggio C++"), e verso la fine del libro parla proprio
della garbage collection: in effetti in quei due paragrafetti non c'ho
capito molto, ma sono stato colpito dal fatto che se ne parlava come di un
modo per simulare una memoria infinita in una memoria limitata. Cosa
dovrebbe significare ciò?
Cecco

 dovrebbe significare cir?
O che BS e' impazzito o che tu non hai capito cosa voleva dire.
L'unica cosa che un meccanismo di grabage collection ha in comune con la memoria
infinita e' che fai solo le allocazioni ma non fai mai le disallocazioni.
Pero' non emula per nulla la memoria infinita: se allochi troppa roba tutta
insieme alla fine la memoria finisce. Quello che la garbage collection fa e' che
libera automaticamente la memoria che tu non puoi piu' usare perche' non hai
piu' nessun puntatore ad essa. Se tu mantieni da qualche parte gli indirizzi
della memoria che hai allocato e continui ad allocarne altra ... alla fine hai
comunque un out of memory!


[...]
Non ho trovato nessun punto in cui BS dice una cosa simile, quello che
vuole dire è che se c'è un errore per cui della memoria non viene
deallocata in un programma che funziona per un lungo periodo si può
esaurire la memoria e i garbage collectors possono evitare questo.
Ma BS parla anche di implementazioni di compilatori C++ che fanno uso
di garbage collection, ma come fanno? Fino a quando viene usata in un
linguaggio come python in cui tutto è una specie di reference non è
complicato implementarlo ma in c++ potrei avere un puntatore a una
classe che in qualche modo "nascondo" in qualche altro tipo.
--
Marco Barisione (ICQ 84277092)

di garbage collection, ma come fanno?
Infatti.
Credo che il meccanismo sia quello di rimpiazzare le routine
di allocazione/deallocazione con proprie routine.

Grazie a tutti per le risposte, credo di aver intuito cosa intendeva BS con
simulazione di memoria infinita, nonostante le mie conoscenze siano ancora
scarse.
Comunque, tanto per puntualizzare, io mi riferivo alla II edizione di "Il
linguaggio C++", edizione italiana, e il paragrafo a cui facevo riferimento
è il 14. 10.1, intitolato, per l'appunto, "Garbage collection". Ho
controllato anche nella III edizione, in lingua originale, ed in effetti non
vi ho trovato discorsi simili. Che sia BS che si è ricreduto oppure il
traduttore che ha interpretato il testo dopo aver fumato la biada? In ogni
caso inizio a pensare che sia opportuno imparare bene l'inglese (e non solo
per quanto riguarda i testi di informatica)!
Cecco

 per quanto riguarda i testi di informatica)!
Amen.


 wrote in message
news:3b9d8fa5...@news.tin.it...

Per questo non serve un compilatore speciale. Lo fai con qualunque compilatore.
Peccato che non sia sufficiente ad avere un grbage collector.
La cosa piu' simile alla garbage collection che puoi fare senza un compilatore
speciale e' il reference counting unito all'uso di smart pointers.
Ma ovviamente questa non e' una soluzione 100% dato che ti toglie i bachi da
deallocazione al costo di una forte disciplina nell'uso degli smart pointer
strong e weak per evitare link circolare e altre amenità.
Il fatto e' che se usi la disciplina ... non senti la necessità di "dimenticarti
di deallocare".


 Marco Barisione (ICQ 84277092)
Ho letto anche il discorso di BS sulla "memoria infinita".
Si riferiva alla questione se chiamare o meno il distruttore di un
oggetto una volta che la sua memoria viene reclamata dal GC.
L'idea originaria era di considerare il GC un modo per poter
allocare piu' memoria di quanta effettivamente se ne ha e quindi
di considerarlo un modo per avere memoria "infinita".
Secondo questa visione gli oggetti non vengono mai distrutti e
quindi il distruttore non deve essere chiamato. Successivamente
se non sbaglio BS ha cambiato idea.
Esistono GC per C++, non necessariamente legati ad un particolare
compilatore, ma disponibili come librerie
Su 
http://www.hpl.hp.com/personal/Hans_Boehm/gc/
ad esempio puoi trovare un garbage collector per C++ ( e C ), tra l'altro
gratuito. Ci sono parecchie informazioni su come sono fatti i GC
in generale ( e i vari tipi di GC ), oltre che a testi specifici
al GC per C++.
( Tra l'altro il cenno alla "memoria infinita" mi sembra di averlo
proprio letto su quel sito )
Marco Righele