Diferença entre Free e FreeAndNil
Opa Galera,
Poderiam me dizer qual diferença
entre Free e FreeAndnil no Delphi e para qual ocasião eles vão me servir ?
Poderiam me dizer qual diferença
entre Free e FreeAndnil no Delphi e para qual ocasião eles vão me servir ?
Anderson Mendes
Curtidas 0
Respostas
Marco Salles
15/09/2012
na teoria o freeandnil alem de liberar o objeto ele invalida o ponteiro ou o torna nil
vaja o que diz a VCL a respeito
porque tornar o ponteiro do objeto igaul a nil ?
Para não utiliza-lo indevidamente
assim se vc testa ( podemos tb utilizar o Assigned)
if obj = nil then
Opa não posso utilizar o objeto tenho que instancia-lo senão da acesso Violado
Porque que eu disse na teoria ... Porque em muitas situações não adianta dar Freeandnil
Veja o exemplo , imagine dentro de um evento no onclick de um botão
Veja que nesta situação , não adianta fazer FreeanNil(ObjInt) que sempre vai dar um Ponteiro válido
Quer dizer vc ate poderia fazer
vaja o que diz a VCL a respeito
procedure FreeAndNil(var Obj); var Temp: TObject; begin Temp := TObject(Obj); Pointer(Obj) := nil; /////// Invalida o ponteiro Temp.Free; /// Libera o Objeto . libera recursos da aplicação , desaloca memória etc.... end;
porque tornar o ponteiro do objeto igaul a nil ?
Para não utiliza-lo indevidamente
assim se vc testa ( podemos tb utilizar o Assigned)
if obj = nil then
Opa não posso utilizar o objeto tenho que instancia-lo senão da acesso Violado
Porque que eu disse na teoria ... Porque em muitas situações não adianta dar Freeandnil
Veja o exemplo , imagine dentro de um evento no onclick de um botão
var
objEx:Tedit;
procedure TForm1.Button1Click(Sender: TObject);
var
objIn:Tedit;
begin
if Assigned(ObjEx) then
Showmessage('Ponteiro válido')
else
Showmessage('Ponteiro Inválido');
if Assigned(ObjIn) then
Showmessage('Ponteiro válido')
else
Showmessage('Ponteiro Inválido');
end;
Veja que nesta situação , não adianta fazer FreeanNil(ObjInt) que sempre vai dar um Ponteiro válido
Quer dizer vc ate poderia fazer
var
objEx:Tedit;
procedure TForm1.Button1Click(Sender: TObject);
var
objIn:Tedit;
begin
if Assigned(ObjEx) then
Showmessage('Ponteiro válido')
else
Showmessage('Ponteiro Inválido');
FreeAndNil(ObjEx);
if Assigned(ObjIn) then
Showmessage('Ponteiro válido')
else
Showmessage('Ponteiro Inválido');
//FreeAndNil(ObjIn); ********************Isto nada adianta
ObjIn:=nil;
end;procedure FreeAndNil(var Obj); var Temp: TObject; begin Temp := TObject(Obj); Pointer(Obj) := nil; Temp.Free; end;
GOSTEI 0
Singular Ti
15/09/2012
Isso ae Marco... Otima explicação!!!
GOSTEI 0
Marco Salles
15/09/2012
opa , um elegio é sempre um elógio. Porém um elógio de uma pessoa com o seu aporte valem dez elógios...
muito obrigado mesmo
muito obrigado mesmo
GOSTEI 0
Anderson Mendes
15/09/2012
Valeu mesmo pela resposta,
otima explicação, muito bom.
brigado.
otima explicação, muito bom.
brigado.
GOSTEI 0