0

オブジェクト (私の場合は TJSONData) があり、このオブジェクトを解放したい場合、プログラムフローがこの位置でハングすることがあります。私のコードには既に次のような構造がありますが、場合によっては適合しないようです:

if Assigned(MyRecord.MyJSONData) then
begin
  MyRecord.MyJSONData.Free;
end;

オブジェクトを 2 回解放しようとすると、この動作をテストで再現できます。私のプログラムでは、これは通常は起こらないはずですが、今私の本当の質問:

オブジェクトがすでに解放されているかどうかを確認する方法はありますか? または、FreeAndNil(); も使用する必要がありますか?

4

2 に答える 2

6

Assigned 関数は、参照がnil でないかどうかを確認します。nil でない場合は True を返し、nil の場合は False を返します。

明らかに、オブジェクトを解放し、参照を nil に設定しないと、次の割り当て済みチェック (参照 <> nil) に合格し、再度解放が試行されます。しかし、参照 (ポインター) は既にぶら下がっています (解放された、またはさらに悪いことに、変更されたメモリーを指しています)。

一般に、参照をnil以上に設定する必要があります - FreeAndNil 関数を使用してください。このようにして、解放されたオブジェクトにアクセスするたびに、それは nil になり、それがあなたのチェックになります。

于 2012-07-19T11:06:32.870 に答える
-1

FreeAndNil について、Delphi フォーラム (最終的にフォーラムを押しつぶすトレッド) に大きなスレッドがありました。

共通点は、タスクの 95%では、オブジェクトが生きているかどうかをチェックするべきではないということでした。事前にそれを知っておいて、それらのチェックを常に知り、決して必要としないようにプログラムを設計する必要があります。

一部の存続または復活したリンクは、http://www.theregister.co.uk/2012/01/16/verity_stob_sons_of_khan_2011/print.htmlおよびhttps://forums.embarcadero.com/message.jspa?messageID=413796にあります。

于 2012-07-19T11:48:01.587 に答える