Newsgroup: it.comp.lang.delphi
Titolo: Chiarimenti sull'uso di Free o FreeAndNil

Ciao a tutti,
mi ricordavo che normalmente era consigliabile usare FreeAndNil al posto del
solo Free perché, oltre a liberare la memoria occupata dall'oggetto stesso
evita che per errori di programmazione vi siano dei puntamenti "a zone di
memoria errate".
Oggi, cercando tutt'altro su internet, mi sono imbattuto in alcuni post in
lingua inglese dove si diceva che FreeAndNil va usato il meno possibile e va
privilegiato l'uso di Free.
Voi normalmente quale dei 2 usate?
Grazie, Mario
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 memoria errate".
FreeAndNil() va usato il meno possibile perché dà l'illusione di sapere
ciò che si sta facendo.  Ci sono casi in cui è obbligatorio usarlo, altri
in cui se ne fa benissimo a meno.  In realtà, raramente il fatto che
un'istanza venga reimpostata a "nil" ha senso per un'applicazione.  Se si
fa troppo affidamento su questa informazione, si sta sbagliando sicurament
qualcosa dal punto di vista progettuale.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 Voi normalmente quale dei 2 usate?
Normalmente, uso /FreeAndNil/ quando è necessario distruggere un oggetto 
e porre il suo riferimento, contenuto in una variabile, a *nil*; in sostanza
   FreeAndNil(Reference);
per me equivale a
   Reference.Free;
   Reference := nil;
Generalmente, uso solamente la chiamata al metodo /Free/ quando si 
tratta di un riferimento contenuto in una variabile locale, quindi non è 
strettamente necessario che tale riferimento sia impostato a *nil* 
poiché la variabile non ha validità all'esterno della routine, a meno 
che non debba essere riutilizzata. Ad esempio
   var
     Reference: TMyObject;
   begin
     Reference := TMyObject.Create;
     try
       Reference.DoSomething;
     finally
       Reference.Free;
     end;
   end;
In sostanza, per me /FreeAndNil/ costituisce solamente un sostituto al 
blocco di istruzioni che chiamano il metodo /Free/ e reimpostano a *nil* 
la variabile passata, contenente il riferimento. Non sono al corrente di 
controindicazioni o altri effetti collaterali legati a questa procedura.
Nei post che hai trovato era riportata qualche spiegazione o motivazione 
in proposito?
Ciao,
   Marco.
-- 
MARCO BREVEGLIERI
  (
http://www.marco.breveglieri.name
)

 in proposito?
Cavolo, il genio di un mio collega mi ha appena cancellato la cronologia di
FireFox per farmi uno scherzo :-(((
Ho ritrovato solo questo perché avevo stampato la pagina ed ho potuto rifare
la ricerca:
http://groups.google.it/group/comp.lang.pascal.delphi.misc/browse_frm/thread/5a66ac54cf88d10d/5366221870986d3c?lnk=st&q=&rnum=1&hl=it#5366221870986d3c


 la ricerca [...]
Ho letto, ma non ho comunque riscontrato nulla di strano a parte quanto 
è già stato detto. :-)



Forse ho tradotto male questo pezzo:
FreeAndNil is a convenience procedure provided for Delphi or C++ Builder
products using a VCL version prior to VCL 5.
..as if this procedure is somehow deprecated and should not be used.
Alla fine della frase non dice che sarebbe meglio non usarlo?


 in cui se ne fa benissimo a meno.
Quando, per esempio è obbligatorio usarlo?


 Quando, per esempio è obbligatorio usarlo?
"Obbligatorio" in realtà mai, ho usato un termine improprio.
E' conveniente (semplicemente perché accorcia i passi) quando hai bisogno
di porre un riferimento a nil.  Vedi nel caso:
MioOggetto := TMiaClasse.Create;
try
  ... 
  ...
  FreeAndNil(MioOggetto); <<--- libero subito l'istanza...
  ...
  ...
  ...
finally  
  MioOggetto.Free; <<-- libero comunque l'istanza se succede qualcosa
prima     
                        del FreeAndNil()
end;
In generale, comunque, FreeAndNil() serve a poco e niente.
