Create済みかどうかの判断

解決


JJ  2010-06-29 11:52:05  No: 38725  IP: 192.*.*.*

オブジェクトがCreate済みかどうかを判断するのにAssignedを使用していますが、
  Hoge :THoge

  if Assigned(Hoge) then Hoge.free;

とするとCreateしていないのにAssigned(Hoge)がTrueになってしまいます。
こういった場合はどのように判断するべきでしょう?

編集 削除
tor  2010-06-29 13:14:48  No: 38726  IP: 192.*.*.*

Assigned(P) は P<>nil と等価で、変数の値がnilかどうか確認しているにすぎません。
Hogeがグローバル変数やクラスのフィールドなら、自動的にnilで初期化されますが
もしローカル変数だとしたら、自分でnilを代入しておく必要があります。
Hoge := nil;

もっとも、初期化しなかったらコンパイル時に警告が出るはずですが……
(逆にnilを代入している行で「代入している値は使われない」という警告が出るようなら、
その変数は必ずCreateで値が割り当てられる、つまり心配するだけ無駄だということです)

ちなみに、ヘルプにもあるように Hoge.Free はHogeがnilなら何もしません。
したがってFreeの前にnilかどうかチェックする必要はありません。
(FreeAndNilなら、二重Freeを防ぐという点で無意味ではないかもしれませんけど)

編集 削除
JJ  2010-06-29 14:01:31  No: 38727  IP: 192.*.*.*

torさん

確かにローカル変数ではNilはセットされていませんでした。
いわれているとおり、最初にNilをセットしておけば問題なくできました。

FreeはNilなら何もしないので、Nilかどうかの判断は確かにいらないですね。

色々わかりました、ありがとうございました。

編集 削除