Newsgroup: it.comp.lang.delphi
Titolo: Cultura generale del Delphi (lungo)

3 domandine veloci veloci da leccarsi le orecchie....  : )
a) vorrei sapere quali sono i risultati di questo fantasioso ciclo:
  ( c:integer   -  p:pointer )
     for c:=1 to 100000 do getmem(p,c)
Ogni ciclo viene allocata memoria....ma la memoria allocata nel ciclo
precedente che fine fa? 
a1) Viene liberata e poi riallocata nella giusta dimensione oppure 
a2) colleziono memoria "morta" e ho cosi' alla fine del ciclo
1+2+3+....+99999+100000 byte utilizzati?
b) Nel caso la risposte sia a2) avrebbe senso (sempre se ha senso
creare un ciclo del genere) aggiungere un modifica tale da rendere il
ciclo in questo modo:
for c:=1 to 100000 do
   begin
     if c>1 then dispose(p);
     getmem(p,c)
   end;
oppure c'e' un modo per capire se un puntatore e' stato allocato?
(In questo caso potrei mettere al posto della 2nda riga
-  if  (puntatore e' allocato) then dispose(p)
c) mi trovo danti ad un array dinamico:
type  ttabella=array [0..0] of  byte;
var    tabella:^ttabella;
gia dimensionato a mio piacimento
(begin
	getmem(tabella,100000);
end;)
mi e' capitato  erroneamente di consultare un elemento della tabella
in questo modo    tabella[65] anziche'  tabella^[65] ma con mia
sorpresa il compilatore non mi ha dato errore anzi mi ha dato il
valore corretto del 65esimo elemento della tabella.
Chi mi sa spiegare questo arcano?
Grazie
~Guybrush~

Chi mi sa spiegare questo arcano?
E' una particolarita' di Delphi. L'apice con i puntatori non e'
strettamente necessario.
--
Andrea Laforgia (ICQ 87230455)
------------------------------ 
#exclude <windows.h>

 65esimo elemento della tabella. Chi mi sa spiegare questo arcano?
se e' per questo anche tutti gli oggetti che hai usato fino ad ora 
avresti dovuto usare ^
Button1^.Caption := ...
...e' il compilatore che e' furbo ;), il cappelletto lo puoi omettere.
Ciao,
Alan Solo

cmq direi che senso ne ha poco
Aspe' per la cronaca il primo ciclo non e' uguale al secondo...
...sempre se tu non hai inteso il dispose e il getmem del primo ciclo
entrambi riferiti al THEN e quindi condizionati dall' IF.
Ciao
~Guybrush~

 entrambi riferiti al THEN e quindi condizionati dall' IF.
Aspi' (??) :),
TizioPennello, hai ragione.. ho visto un begin end di troppo... ;)
Ciao,
Alan Solo

 in Java, oltre con in Object Pascal.
l'OP non mi risulta che abbia un GC, sei sicuro?
Ciao,
Alan Solo

strettamente necessario.
Beh quando si parla di array dinamici..
puoi fare
tabella[n]:=x;
ma non
var i:^integer;
i:=10;
almeno mi pare.. :)
ciao !

sia anche su windows, o se dipenda dal compilatore piuttosto che dal SO..
Questo sistema si chiama "garbage collection" ed e' implementato anche
in Java, oltre con in Object Pascal.
A mio avviso, come regola generale di buona programmazione, bisogna
sempre deallocare le risorse allocate, pena trovarsi poi a sbagliare
gravemente con linguaggi (come il C++) che non implementano alcun
meccanismo di "raccolta della spazzatura".


 in Java, oltre con in Object Pascal.
Object Pascal non dispone di alcun Garbage Collector, e neppure di un
Reference Counter.
--
- Carlo -
c.b...@libero.it

Reference Counter.
Esiste, esiste, e vale per i tipi "interfaccia", che hanno un
reference counter.


 counter.
di quello ne ho sentito parlare (mai provato/sperimentato)
ma vale, appunto, *solo* sugli interface, ma non mi risulta
(purtoppo/perfortuna) che l'OP abbia un GC "puro"
Ciao,
Alan Solo

 reference counter.
RC e GC sono due cose differenti, per quanto il loro funzionamento possa
*sembrare* uguale.
Di per se l'OP non ha alcun RC o GC.
