TObject和NIL Delphi中的析构函数类

时间:2012-03-17 21:24:19

标签: delphi memory free destructor

我想知道为什么在我调用Free方法之后,对象不是nil 我的意思是下一堂课:

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;

我的问题是,为什么在释放对象后nil以及如何在不使用a的析构函数后使nil成为a := nil

2 个答案:

答案 0 :(得分:10)

<强>解释

变量a只有在分配 nil时才会变为nil。这意味着代码中需要a := nil,现在缺少。

Free 只是一个方法,处理Ta类的实例。免费销毁a指向的实例。 a仍然相同,现在指向曾经是Ta实例的内存地址。

<强>解决方案:

使用FreeAndNil(a)同时销毁变量指向的对象并对变量进行nillify。

答案 1 :(得分:3)

实例方法无法修改调用该方法的实例变量。这是因为方法传递了实例变量的副本(隐式Self参数),而不是将引用传递给实例变量。