[Lazarus-es] Pregunta sobre FreeAndNil

José Mejuto joshyfun en gmail.com
Mar Jun 15 14:38:41 CEST 2010


Hello christian,

Tuesday, June 15, 2010, 1:11:02 AM, you wrote:

>> Por que estás haciendo algo mal, ya que FreeAndNIL hace exactamente
>> eso.
cO> Plop :p

:) :) :)

>> A menos que lo que falle sea que no compile, entonces la causa es
>> otra.
cO> Compila normal ...

Ah! bien...

cO> TobjectList, mmm uso arrays de componentes por ejemplo:
cO> FullPanels : Array of Panels;
cO> ahora en el mismo destructor pongo
cO> FreeAndNil(FullPanels[i])  // recorro el i y me manda error al ejecutar el
cO> destructor

Bueno, esto ya huele a fallo del compilador o similar, ya que
FreeAndNIL espera un parámetros (TObject) modificable, si le pasas un
elemento de un array no es exactamente lo mismo y es posible que se
esté equivocando. Versión del compilador fpc ?

cO> le cambio por
cO> fullPanels[i].free;
cO> fullPanels[i]:=nil;
cO> y esto si funciona en el mismo destructor

Es lo mismo, sólo hay una diferencia en como funciona FreeAndNIL y es
en el caso de que el free lance una excepción. Básicamente lo que hace
FreeAndNIL es:

tmp:=fullPanels[i];
FullPanels[i]:=nil;
tmp.free;

De este modo, aunque el .free lance una excepción, el :=nil siempre se
ha ejecutado. Vamos que debería llamarse NILAndFree :)

Por cierto, en vez del array sería más lógico (a mi modo de verlo)
usar un TObjectList, ya que cuando borras un elemento del TObjectList
el free se invoca automáticamente, al igual que cuando haces un free
sobre el TObjectList, liberando todos los objetos.

-- 
Best regards,
 José





More information about the Lazarus-es mailing list