Diferença entre Free e FreeAndNil

Delphi

15/09/2012

Opa Galera,

Poderiam me dizer qual diferença

entre Free e FreeAndnil no Delphi e para qual ocasião eles vão me servir ?
Anderson Mendes

Anderson Mendes

Curtidas 0

Respostas

Marco Salles

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

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

Singular Ti

15/09/2012

Isso ae Marco... Otima explicação!!!
GOSTEI 0
Marco Salles

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
GOSTEI 0
Anderson Mendes

Anderson Mendes

15/09/2012

Valeu mesmo pela resposta,

otima explicação, muito bom.

brigado.
GOSTEI 0
POSTAR