12

アプリケーションを閉じるときに何かを破棄したいのに、なぜ「ファイナライズ」を使用するのか知りたいのですが。アプリケーションを閉じると、.Freeを呼び出さずにすべてのオブジェクトが直接解放されませんか?

ありがとう。

4

2 に答える 2

19

アプリケーションを閉じると、呼び出さずにすべてのオブジェクトが直接解放されませんFreeか?

いいえ。Delphiクラスインスタンスはガベージコレクションされないため、手動で破棄する必要があります。

ただし、実行可能プロセスについて話している場合、オペレーティングシステムはプロセスの終了時にプロセスが所有するすべてのリソースを再利用するため、特定のオブジェクトを破棄しないことは完全に許容できます。したがって、Delphiデストラクタは実行されませんが、プロセスが終了すると、OSはすべてを整理します。プロセスが終了すると、プロセスがシステムリソースをリークすることはありません。

ユニットがDLLまたはパッケージに含まれている場合、そのDLLが単一のプロセスに繰り返しロードおよびアンロードされると、ファイナライズ時にすべてのオブジェクトを破棄できないとメモリリークが発生することに注意してください。

コードが実行可能ファイルでのみ実行されることがわかっている場合は、Freeファイナライズ時にオブジェクトに自由を感じないでください。メモリリーク検出ツールを使用している場合は、意図的にリークしたオブジェクトがメモリリークとして扱われることに注意してください。を呼び出してそれに対処しRegisterExpectedMemoryLeakます。

最後に、オブジェクトのデストラクタがメモリを解放する以上のことを行う場合があるということです。たとえば、設定ファイルやレジストリに値を保存できる場合があります。当然、そのようなオブジェクトのデストラクタの実行を省略したくないでしょう。

于 2012-08-01T09:28:45.290 に答える
5

David Heffermanの答えの最後のポイントに加えて、チェックサムを生成するファイルハンドラーや、特定の状態にする必要のあるPCに接続されたハードウェア(レーザーなど)など、正しく解放する必要のあるリソースが他にもあります。オフになっています。これは私が現在作業しているものです)。

于 2012-08-02T07:33:35.857 に答える