我还有另外一个问题
我有一个班级
当我按下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的位置是否是一个被破坏的实例
答案 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)
变量
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
作为比较:
在一个随机的城市拍摄一个核武器,并惊讶于你的地球上仍然存在城市。如果地球没有更新,旅行者将如何知道他的目的地不存在?