2012-05-11 20 views
2

FreeAndNilがオブジェクトを配置する理想的なアプローチかどうかは疑いがあります。Delphi 7のFreeAndNilの代替手段は何ですか?

StringList1.Free; 
StringList1 := Nil; 

などのコードを使用しています。上記の行は過剰な行為ですか、それとももっと良い方法ですか? 2つのアプローチの違いは何ですか?

+0

[どちらが望ましいですか:無料またはFreeAndNil?](http://stackoverflow.com/questions/3159376/which-is-preferable-free-or-freeandnil) –

+1

私はそこに別々のSOすでにこのトピックに関する議論。したがって、閉鎖されている方が良いと思います。 – CyprUS

+0

これは、この質問が何であるかによって異なります。私はFreeAndNilとこの問題の2行のコードの違いとしてそれを読んでいます。その読みが正しい場合、これは欺瞞ではありません。あなたの質問は何ですか? –

答えて

9

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

+0

FreeAndNilは実際には内部でNilThenFreeなので、場合によっては順序が重要であることに注意してください。 – Kromster

5

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

FreeAndNilは、Freeが発生してもNilに参照を設定するという唯一の違いがあります。しかし、あなたのデストラクタは決して上げてはいけないので、私の見解ではそれほど大きな問題ではありません。

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

私は、適切な設計上の選択であるかどうかFreeAndNilを始めるつもりはありません。その話題は、他のところでいくつかの深みでカバーされています。

+0

+1「Free」vs「FreeAndNil'」についてのやむを得ない一般的な議論を避けるための+1: – jpfollenius

+0

「あなたが参照を除外したいならば、あなたはFreeAndNilを使うかもしれません。また、あなたが良いリファレンスを持っている場合、リンクを与える、私は深く知りたいです – CyprUS

+1

FreeAndNilは自明です。コードはそれをすべて言います。私が指摘しているのは、自由にオブジェクトを作成し、参照を不要にしたい場合、2つの別々のステップで行うのではなく、FreeAndNilを呼び出すことです。私は本当にそれを明確にすることはできません。 –

関連する問題