2

FreeAndNilがオブジェクトを破棄するための理想的なアプローチであるかどうかは疑問です。私は次のようなコードに出くわしました

StringList1.Free; 
StringList1 := Nil;

使用されている。上記の行はやり過ぎですか、それとも物事を行うためのより良い方法ですか?2つのアプローチの違いは何ですか?

4

2 に答える 2

9

厳密に言えば、オブジェクトを破棄するには、を呼び出すだけですDestroy。ただし、参照が、の場合nil。オブジェクトの有効なインスタンスへのポインタが割り当てられていない場合、アクセス違反が発生する可能性があるため、Free代わりに呼び出すことをお勧めします。これは、渡された参照がnilであるかどうかを最初にチェックし、その場合は何もしません。 FreeAndNil最初に渡された参照を一時ローカル変数に割り当て、次に渡された参照に割り当て、次にインスタンスを破棄するためにnil呼び出します。とシーケンスFreeの唯一の違いは、最初のケースでは、デストラクタが例外を発生させた場合でも、渡された参照が存在することです。FreeAndNilobj.Free; obj := nil;nil

于 2012-05-11T06:34:45.637 に答える
5

あなたの質問のコードは、おそらくについて知らない誰かによって書かれていFreeAndNilます。FreeAndNilまたは、RTLに追加される前に最初に作成された可能性があります。参照をゼロにしたい場合は、を使用することもできますFreeAndNil。手書きで書き出すことは役に立ちません。

唯一の本当の違いは、レイズした場合でもFreeAndNil参照をに設定することです。しかし、あなたのデストラクタはとにかく決して上げるべきではないので、これは私の見解ではそれほど大きな問題ではありません。NilFree

には一般的なトラップがありFreeAndNilます。型指定されていないパラメーターを受け取るため、何でも渡すことができます。たとえば、インターフェイスやレコードなどを渡すことができます。この間違いを犯すと、通常、奇妙なランタイムエラーが発生します。

FreeAndNil適切な設計上の選択であるかどうかについては、始めません。そのトピックは他の場所である程度深くカバーされています。

于 2012-05-11T06:30:15.387 に答える