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 ユニットからエクスポートされています)
|
|