2012-03-17 91 views
1

可能重复:
Destructor class in TObject and NIL Delphi析构函数类再次

我有另外一个问题为你们

我有一个类的Ta

当我按下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; 

两个实例都被破坏了bot只有一个是NIL。我将如何写信知道b是否为空(已销毁)。我前人的精力如何更改代码,以便它应该写我

a is nil 
b is nil 

所以我的问题是我应该怎么做才能知道,如果在指针B的位置是destoryed实例

+4

不,它不是。这是一个不同类型的问题 – user558126 2012-03-17 21:59:27

+0

近距离投票的解释:在复制问题中'a'变量的规则也适用于你的'b'变量。对不起,但这真的不是魔术,或难以理解。只要再想想它2秒。 – NGLN 2012-03-17 22:00:24

+0

我问,如何知道变异B(从指针位置)的内容是否空闲(没有任何内容,未分配),在另一个变量A(使用相同指针)释放该对象 – user558126 2012-03-17 22:02:41

回答

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

+0

这非常有趣,但是如何在两个不同的变量参考指向同一个对象的问题的情况。 – 2012-03-17 22:44:36

+1

@DavidHeffernan,'b'的引用不变,每个都有自己的内存位置。关于绝对指令,这里是一篇不错的[文章](http://www.deltics.co.nz/blog/?p=586)。 – kobik 2012-03-17 23:00:52

+0

b如何保存传递的对象可以来自不同的来源和不同的类型? – Justmade 2012-03-18 00:43:33

4

报价my previous answer

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

自由是只是一种方法,在Ta类的实例上工作。免费销毁a指向的实例。 的值a仍然是相同的,现在指向曾经是Ta实例的存储器地址。

使用FreeAndNil(a)可以同时销毁变量指向的对象并使变量变细。

这些规则同样适用于你的b变量:

b指向一个对象,你释放对象,你不要碰b的价值,所以b仍然指向这里曾经是一个内存地址一个Ta对象。

随着FreeAndNil(a)你破坏对象a指向,你nillify a。在此期间,指向的对象b被销毁,但b的值仍未触及。

解决方案:

FreeAndNil(a); 
b := nil; 

,作为比较对象:

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

+0

所以你不能验证指针B(即与A相同)的内容是否没有任何内容?我想从A中释放对象,并且我想从B中知道对象是否空闲 – user558126 2012-03-17 22:08:11

+1

是的!测试指针是否指向现有对象是不可能的。 – NGLN 2012-03-17 22:13:42

+0

b:= a; a.FREE; //它会从内存中破坏我的对象 if IS A DESTROYED then show('yes a');如果IS B被销毁,则显示('yes b'); 它应该写两个消息,所以你不能 – user558126 2012-03-17 22:14:40