在TObject和NIL Delphi中再次使用析构函数类

时间:2012-03-17 21:55:38

标签: delphi oop class memory

  

可能重复:
  Destructor class in TObject and NIL Delphi

我还有另外一个问题

我有一个班级

当我按下Button1时,它正在执行下一个代码

    var a,b:TA;
begin
    a:=Ta.Create;
    b:=a;
    a.i:=30;

    FreeAndNil(a);

    if (a = NIL) then ShowMessage("a is nil");
    if (b=NIL) then ShowMessage("b is nil");

end;

两个实例都被破坏,只有一个是NIL。如何写我知道b是否为空(被破坏)。如何更改代码以便它应该写我

a is nil
b is nil

所以我的问题是如何知道指针B的位置是否是一个被破坏的实例

2 个答案:

答案 0 :(得分:6)

您可以声明b: Ta absolute a;
这允许您指示编译器将b变量视为存在于同一内存位置,有效地将一个变量叠加在另一个上面。

procedure TForm1.Button1Click(Sender: TObject);
var a: Ta;
    b: Ta absolute a;
begin
  a := Ta.Create;
  b := a;
  a.i := 1;
  FreeAndNil(a);
  if (a = NIL) then ShowMessage('a is nil');
  if (b = NIL) then ShowMessage('b is nil');
end;

这是一篇有用的文章:Absolute (for) Beginners

答案 1 :(得分:4)

引用my previous answer

  

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

     

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

     

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

这些相同的规则适用于您的b变量:

b指向一个对象,你释放了该对象,你没有触及b的值,所以b仍然指向一个曾经是{{1}的内存地址对象。

使用Ta销毁指向的对象FreeAndNil(a),您需要a。在此期间,指向的对象a被销毁,但b的值仍未被触及。

<强>解决方案:

b

作为比较:

在一个随机的城市拍摄一个核武器,并惊讶于你的地球上仍然存在城市。如果地球没有更新,旅行者将如何知道他的目的地不存在?