オブジェクトがCreate済みかどうかを判断するのにAssignedを使用していますが、
Hoge :THoge
if Assigned(Hoge) then Hoge.free;
とするとCreateしていないのにAssigned(Hoge)がTrueになってしまいます。
こういった場合はどのように判断するべきでしょう?
Assigned(P) は P<>nil と等価で、変数の値がnilかどうか確認しているにすぎません。
Hogeがグローバル変数やクラスのフィールドなら、自動的にnilで初期化されますが
もしローカル変数だとしたら、自分でnilを代入しておく必要があります。
Hoge := nil;
もっとも、初期化しなかったらコンパイル時に警告が出るはずですが……
(逆にnilを代入している行で「代入している値は使われない」という警告が出るようなら、
その変数は必ずCreateで値が割り当てられる、つまり心配するだけ無駄だということです)
ちなみに、ヘルプにもあるように Hoge.Free はHogeがnilなら何もしません。
したがってFreeの前にnilかどうかチェックする必要はありません。
(FreeAndNilなら、二重Freeを防ぐという点で無意味ではないかもしれませんけど)
torさん
確かにローカル変数ではNilはセットされていませんでした。
いわれているとおり、最初にNilをセットしておけば問題なくできました。
FreeはNilなら何もしないので、Nilかどうかの判断は確かにいらないですね。
色々わかりました、ありがとうございました。
ツイート | ![]() |