Italian community of Lazarus and Free Pascal
Programmazione => Generale => Discussione aperta da: Lorenzo il Ottobre 28, 2026, 10:11:40 PM
Purtroppo essendo duro di comprendonio,non ho ancora compreso la netta differenza tra il metodo Free() e FreeAndNil()
Sono quando richiamiamo Free() da un oggetto(ad esempio obj.Free()),viene richiamato il costrutto e disallocato il relativo puntatore.
FreeAndNil(obj) si comporterebbe alla medesima maniera?
Il metodo Free semplicemente libera le risorse dell'oggetto.
Ma la variabile che referenzia l'istanza dell'oggetto punta ancora alla vecchia istanza non più esistente.
Per terminare correttamente il tutto sarebbe necessario settare a NIL la variabile.
Il metodo FreeAndNil invece fà entrambe le cose, prima esegue il Free e poi pone a NIL la variabile.
Bisogna fare attenzione ad usare il FreeAndNil: ci sono delle classi che rilasciano le risorse non immediatamente, e non in maniera sincrona alla chiamata del FREE: una classe base tra le più note è il TThread, ma anche tutte le classi che hanno a che fare con le "comnuicazioni" come con i socket.
Porre a NIL una variabile relativa ad una istanza di un oggetto che non è ancora del tutto "liberata" non è detto generi per forza problemi, ma su quella istanza non si avrà alcun controllo e normalmente genererà un LEAK (ma non è detto).
Come sunto:
- FreeAndNil và bene in tutte la classi in genere, eccetto nella classi dove vengono gestiti eventi asincroni (come le comunicazioni appunto).
- Se non si usa FreeAndNil (quindi solo il FREE), sarebbe necessario porre a NIL la variabile per evitare errori di "ACCESS VIOLATION" successivi.
Se una classe figlia di un qualche controllo viene distrutta a "mano" dal nostro codice (senza metterla a NIL), è possibile che quando si eseguirà il free del controllo padre questo andrà in errore perchè il padre distrugge SEMPRE tutti i figli nel FREE e trovandosi ancora un riferimento che non è NIL cercherà di distruggerlo di nuovo.
Teoricamente tutti componenti forniti in bundle dall'ambiente sono protetti da questa eventualità in quanto eseguendo il FREE venogno tolti anche dall'elenco dei "figli", ma se costruite un serie di classi vostre la cosa potrebbe essere diversa.