Create済みかどうかの判断

解決


JJ  2010-06-29 20:52:05  No: 38725

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

  if Assigned(Hoge) then Hoge.free;

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


tor  2010-06-29 22:14:48  No: 38726

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

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

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


JJ  2010-06-29 23:01:31  No: 38727

torさん

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

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

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加