FreeAndNilがオブジェクトを破棄するための理想的なアプローチであるかどうかは疑問です。私は次のようなコードに出くわしました
StringList1.Free;
StringList1 := Nil;
使用されている。上記の行はやり過ぎですか、それとも物事を行うためのより良い方法ですか?2つのアプローチの違いは何ですか?
厳密に言えば、オブジェクトを破棄するには、を呼び出すだけですDestroy
。ただし、参照が、の場合nil
。オブジェクトの有効なインスタンスへのポインタが割り当てられていない場合、アクセス違反が発生する可能性があるため、Free
代わりに呼び出すことをお勧めします。これは、渡された参照がnilであるかどうかを最初にチェックし、その場合は何もしません。
FreeAndNil
最初に渡された参照を一時ローカル変数に割り当て、次に渡された参照に割り当て、次にインスタンスを破棄するためにnil
呼び出します。とシーケンスFree
の唯一の違いは、最初のケースでは、デストラクタが例外を発生させた場合でも、渡された参照が存在することです。FreeAndNil
obj.Free; obj := nil;
nil
あなたの質問のコードは、おそらくについて知らない誰かによって書かれていFreeAndNil
ます。FreeAndNil
または、RTLに追加される前に最初に作成された可能性があります。参照をゼロにしたい場合は、を使用することもできますFreeAndNil
。手書きで書き出すことは役に立ちません。
唯一の本当の違いは、レイズした場合でもFreeAndNil
参照をに設定することです。しかし、あなたのデストラクタはとにかく決して上げるべきではないので、これは私の見解ではそれほど大きな問題ではありません。Nil
Free
には一般的なトラップがありFreeAndNil
ます。型指定されていないパラメーターを受け取るため、何でも渡すことができます。たとえば、インターフェイスやレコードなどを渡すことができます。この間違いを犯すと、通常、奇妙なランタイムエラーが発生します。
FreeAndNil
適切な設計上の選択であるかどうかについては、始めません。そのトピックは他の場所である程度深くカバーされています。