The Delphi Bug List

Entry No.
67
VCL - 一般 - TObject
Free メソッドの呼び出しは常に安全なわけではない(これは TObject の全てのサブクラス、つまり、全てのクラス型にあてはまる)
1.02 2.01 3.0 3.01 3.02 4.0 4.01 4.02 4.03 5.0 5.01 6.0 6.01 6.02 Kylix 1.0
Gotcha Gotcha Gotcha Gotcha Gotcha Gotcha Gotcha Gotcha Gotcha Gotcha Gotcha Gotcha Gotcha Gotcha Gotcha
解説
Free メソッドを呼び出した後でも、オブジェクトの値(ポインタ)は変化しておらず、そのプロパティにもアクセス可能です。再度 Free を呼び出すと GPF が発生します。ドキュメントには、Free メソッドの呼び出しは安全であり、Destroy の代わりに使用するべきだと書かれています。
もし Free がそのポインタに Nil をセットするなら、はるかに理にかなうでしょう。しかし Self は常に値渡しされるため、それに nil をセットしても、'呼び出しているインスタンス' の値に影響を与えることはありません。
解決策 / 回避方法
以下のプロシージャを使用してください:
procedure FreeObject(var A: TObject);
begin
  A.Free;
  A := nil;
end;
Delphi 5 には同じような関数 FreeAndNil が追加されているようです(System ユニットからエクスポートされている?)。
(訳注:FreeAndNil は SysUtils ユニットからエクスポートされています)
Latest update of this entry: 1999-08-01
本家 The Delphi Bug List のエントリーはこちら
The Delphi Bug List 日本語訳 へ