アプリケーションを閉じるときに何かを破棄したいのに、なぜ「ファイナライズ」を使用するのか知りたいのですが。アプリケーションを閉じると、.Freeを呼び出さずにすべてのオブジェクトが直接解放されませんか?
ありがとう。
アプリケーションを閉じるときに何かを破棄したいのに、なぜ「ファイナライズ」を使用するのか知りたいのですが。アプリケーションを閉じると、.Freeを呼び出さずにすべてのオブジェクトが直接解放されませんか?
ありがとう。
アプリケーションを閉じると、呼び出さずにすべてのオブジェクトが直接解放されません
Free
か?
いいえ。Delphiクラスインスタンスはガベージコレクションされないため、手動で破棄する必要があります。
ただし、実行可能プロセスについて話している場合、オペレーティングシステムはプロセスの終了時にプロセスが所有するすべてのリソースを再利用するため、特定のオブジェクトを破棄しないことは完全に許容できます。したがって、Delphiデストラクタは実行されませんが、プロセスが終了すると、OSはすべてを整理します。プロセスが終了すると、プロセスがシステムリソースをリークすることはありません。
ユニットがDLLまたはパッケージに含まれている場合、そのDLLが単一のプロセスに繰り返しロードおよびアンロードされると、ファイナライズ時にすべてのオブジェクトを破棄できないとメモリリークが発生することに注意してください。
コードが実行可能ファイルでのみ実行されることがわかっている場合は、Free
ファイナライズ時にオブジェクトに自由を感じないでください。メモリリーク検出ツールを使用している場合は、意図的にリークしたオブジェクトがメモリリークとして扱われることに注意してください。を呼び出してそれに対処しRegisterExpectedMemoryLeak
ます。
最後に、オブジェクトのデストラクタがメモリを解放する以上のことを行う場合があるということです。たとえば、設定ファイルやレジストリに値を保存できる場合があります。当然、そのようなオブジェクトのデストラクタの実行を省略したくないでしょう。
David Heffermanの答えの最後のポイントに加えて、チェックサムを生成するファイルハンドラーや、特定の状態にする必要のあるPCに接続されたハードウェア(レーザーなど)など、正しく解放する必要のあるリソースが他にもあります。オフになっています。これは私が現在作業しているものです)。