FreeAndNilがオブジェクトを配置する理想的なアプローチかどうかは疑いがあります。Delphi 7のFreeAndNilの代替手段は何ですか?
StringList1.Free;
StringList1 := Nil;
などのコードを使用しています。上記の行は過剰な行為ですか、それとももっと良い方法ですか? 2つのアプローチの違いは何ですか?
FreeAndNilがオブジェクトを配置する理想的なアプローチかどうかは疑いがあります。Delphi 7のFreeAndNilの代替手段は何ですか?
StringList1.Free;
StringList1 := Nil;
などのコードを使用しています。上記の行は過剰な行為ですか、それとももっと良い方法ですか? 2つのアプローチの違いは何ですか?
厳密だけDestroy
を呼び出すために必要なオブジェクトを処分するために、話します。ただし、参照がnil
の場合、つまりオブジェクトの有効なインスタンスへのポインタが割り当てられていない場合、アクセス違反が発生するため、代わりにFree
を呼び出して、渡された参照がnilであるかどうかをチェックし、その場合は何も行いません。 FreeAndNil
は、渡された参照を一時的なローカル変数に割り当て、次に渡された参照にnil
を割り当て、次にFree
を呼び出してインスタンスを破棄します。 FreeAndNil
とシーケンスobj.Free; obj := nil;
の唯一の違いは、デストラクタが例外を発生させたとしても、最初のケースでは、渡された参照がnil
になることです。
FreeAndNilは実際には内部でNilThenFreeなので、場合によっては順序が重要であることに注意してください。 – Kromster
あなたの問題のコードは、おそらくについてFreeAndNil
を知らない誰かによって書かれています。または、おそらく、FreeAndNil
がRTLに追加される前に書かれたのかもしれません。あなたが参照をゼロにしたい場合は、FreeAndNil
を使用することもできます。それを手書きで書くことは役に立たない。
FreeAndNil
は、Free
が発生してもNil
に参照を設定するという唯一の違いがあります。しかし、あなたのデストラクタは決して上げてはいけないので、私の見解ではそれほど大きな問題ではありません。
FreeAndNil
と共通のトラップがあります。型指定されていないパラメータを取るので、何かを渡すことができます。たとえば、インターフェイスやレコードなどを渡すことができます。このミスを犯すと、通常、奇妙なランタイムエラーが発生します。
私は、適切な設計上の選択であるかどうかFreeAndNil
を始めるつもりはありません。その話題は、他のところでいくつかの深みでカバーされています。
+1「Free」vs「FreeAndNil'」についてのやむを得ない一般的な議論を避けるための+1: – jpfollenius
「あなたが参照を除外したいならば、あなたはFreeAndNilを使うかもしれません。また、あなたが良いリファレンスを持っている場合、リンクを与える、私は深く知りたいです – CyprUS
FreeAndNilは自明です。コードはそれをすべて言います。私が指摘しているのは、自由にオブジェクトを作成し、参照を不要にしたい場合、2つの別々のステップで行うのではなく、FreeAndNilを呼び出すことです。私は本当にそれを明確にすることはできません。 –
[どちらが望ましいですか:無料またはFreeAndNil?](http://stackoverflow.com/questions/3159376/which-is-preferable-free-or-freeandnil) –
私はそこに別々のSOすでにこのトピックに関する議論。したがって、閉鎖されている方が良いと思います。 – CyprUS
これは、この質問が何であるかによって異なります。私はFreeAndNilとこの問題の2行のコードの違いとしてそれを読んでいます。その読みが正しい場合、これは欺瞞ではありません。あなたの質問は何ですか? –