问题
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
?
回答1:
Explanation:
The variable a
will only become nil
when it is assigned nil
. That means there needs to be a := nil
in code, which is now missing.
Free is just a method, working on an instance of the Ta
class. Free destroys that instance to which a
pointed. The value of a
is still the same and now points to a memory address where once was an Ta
instance.
Solution:
Use FreeAndNil(a)
to simultaneously destroy the object to which the variable points to and nillify the variable.
回答2:
An instance method cannot modify the instance variable on which the method was invoked. That's because a method is passed a copy of the instance variable (the implicit Self parameter) rather than being passed a reference to the instance variable.
来源:https://stackoverflow.com/questions/9753850/destructor-class-in-tobject-and-nil-delphi