2012-03-17 6 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; 

両方のインスタンスが無効化されているのは、NILだけです。私はbが空である(破壊された)かどうかを知るためにどのように書きますか。それは私に

a is nil 
b is nil 

を書く必要がありますように、どのように私は、コードを変更souldだから私の質問は、私はdestoryedインスタンスが

+4

いいえ、それはありません。ここでは異なるタイプの問題です – user558126

+0

close-voteの説明:dupe質問の 'a'変数のルールは、ここでは' b'変数にも当てはまります。申し訳ありませんが、これは本当に魔法ではなく、理解するのが難しいです。それについて2秒長く考えてください。 – NGLN

+0

私は、(同じポインタを持つ)別のバリアブルがそのオブジェクトを解放している後に、variabile B(ポインタからの場所)の内容がフリーである(何もない、割り当てられていない)かどうかを知る方法を質問しています – user558126

答えて

6

あなたはこれを使用すると、効果的に他の上に1を重ね、同じメモリ位置に存在するものとしてb変数を扱うようにコンパイラに指示することができますb: Ta absolute a;
を宣言することができます。

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

これは非常に興味深いですが、2つの異なる変数参照が同じオブジェクトを指しているという質問の状況はどうでしょうか。 –

+1

@DavidHeffernan、 'b'のリファレンスは変更されておらず、それぞれがそれ自身のメモリ位置を持っています。ここで絶対的な指示についての素敵な[記事](http://www.deltics.co.nz/blog/?p=586)です。 – kobik

+0

bは、渡されたオブジェクトを保存しなければならないのはいかがですか? – Justmade

4

my previous answer引用であるポインタBの場所にあるかどうかを知るために行うべきかです:

変数aは、nilが割り当てられている場合にのみ、nilになります。これはコードにa := nilが必要であることを意味しますが、これは現在欠落しています。

無料ですTaクラスのインスタンスで動作するちょうどメソッドです。無料は、aが指し示すインスタンスを破棄します。 の値aと同じで、今度は一度だけTaインスタンスだったメモリアドレスを指しています。

FreeAndNil(a)を使用すると、変数が指し示すオブジェクトを同時に破棄し、変数を指し示すことができます。

これらの同じ規則はあなたのb変数に適用されます。

bポイントを対象に、あなたがオブジェクトを解放し、あなたはとてもbまだかつてのメモリアドレスを指し、bの値を触れないでくださいTaオブジェクトです。

FreeAndNil(a)とすると、オブジェクトaが破棄され、aにネイル化されます。この間、オブジェクトbが破壊されましたが、bの値は変更されません。

ソリューション:比較として

FreeAndNil(a); 
b := nil; 

ランダム都市で核兵器を撃つと都市があなたの世界ではまだ存在していることに驚かれること。地球儀が更新されていない場合、旅行者は自分の目的地が存在しないことをどのように知っていますか?

+0

したがって、何もない場合、ポインタB(Aと同じ)からのコンテンツがあるかどうかを確認することはできません。私はオブジェクトをAから解放したい、オブジェクトがフリーであるかどうかをBから知りたい場合 – user558126

+1

はい!ポインタが既存のオブジェクトを指しているかどうかをテストすることは不可能です。 – NGLN

+0

b:= a; a.FREE; //私のオブジェクトをメモリから消散させます IS A DESTROYEDの場合、show( 'yes a'); IS Bが破棄された場合、show( 'yes b'); 両方のメッセージを書き込む必要がありますので、 – user558126