I am wondering why after I invoke Free method the object is not nil.
What I mean for example next class:
type Ta = class(TObject)
public
i: integer;
destructor Destroy; override;
end;
destructor Ta.Destroy;
begin
inherited;
end;
procedure Form1.Button1;
var a: Ta;
begin
a := Ta.Create;
a.Free;
if a = nil then
button1.Caption := 'is assigned'
else
button1.caption := 'is not assigned';
end;
My question is why after freeing the object is not nil and how will I make a to be nil after destructor without using a := nil?
Explanation:
The variable
awill only becomenilwhen it is assignednil. That means there needs to bea := nilin code, which is now missing.Free is just a method, working on an instance of the
Taclass. Free destroys that instance to whichapointed. The value ofais still the same and now points to a memory address where once was anTainstance.Solution:
Use
FreeAndNil(a)to simultaneously destroy the object to which the variable points to and nillify the variable.