2012-03-17 3 views
0

Freeメソッドを呼び出した後、オブジェクトがnilでないのはなぜですか?私は、例えば、次のクラスを意味する何
:オブジェクトを解放した後nilではなく、どのように私はa := nilを使用せずに、デストラクタの後nilをするaを行いますなぜTObjectとNILのデストラクタクラスDelphi

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; 

私の質問はありますか?

+6

オブジェクトを解放しても、それをnilに設定することはありません。 FreeAndNil(a)を使用してください – kobik

+0

そしてあなたはデストラクタからそれを作ることができません? – user558126

+4

いいえ、できません。 – kobik

答えて

10

説明:それはnilが割り当てられたときに

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

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

ソリューション:

使用FreeAndNil(a)が同時にこれに変数のポイントにオブジェクトを破壊し、変数をnillifyします。

3

インスタンスメソッドは、メソッドが呼び出されたインスタンス変数を変更できません。これは、メソッド参照がインスタンス変数に渡されるのではなく、インスタンス変数(暗黙的なSelfパラメータ)のコピーが渡されるためです。