グローバル変数を無差別に使用するのは賢明ではないことは承知しています。ただし、TStringList を使用する必要がありました。私の質問は、どのように(そしてどこで)それを解放するのですか? 検索しましたが、それに関するドキュメントは見つかりませんでした。
ありがとう。
グローバル変数を無差別に使用するのは賢明ではないことは承知しています。ただし、TStringList を使用する必要がありました。私の質問は、どのように(そしてどこで)それを解放するのですか? 検索しましたが、それに関するドキュメントは見つかりませんでした。
ありがとう。
これは、メモリ管理の基本原則である Single Ownership Principleを念頭に置くことで解決できます。すべての変数には、クリーンアップを担当する単一の所有者が必要です。
作成するコードが何であれ、適切なタイミングTStringList
でそれを破棄する (そして、それがグローバルの場合は、グローバル変数をnilに設定する) 責任も負う必要があります。では、どこで作成していますか?
一般に重要なリソースを表すグローバルがある場合、それらは通常、プログラム全体を管理するオブジェクトによって設定されます。これらは初期化時に作成され、メイン オブジェクトの破棄中にクリーンアップされます。一方、initialization
ユニットのセクションで作成する場合は、クリーンアップを同じユニットのfinalization
セクションに配置する必要があります。
TStringList は、安全に初期化し、セクションinitialization
で解放する必要がありfinalization
ます。
推奨事項として、グローバル変数へのアクセスを関数にカプセル化することを検討してください。これにより、var 宣言をimplementation
パーツに移動し、それをより詳細に制御できます。
initialization
その他の場合はandfinalization
が不適切な場合があることに注意してください。特に、スレッドが関係している場合やLoadLibrary() / FreeLibrary()
呼び出しが必要な場合は、通常のプログラム フローで専用の手順を使用することをお勧めします。initialization
セクションとセクションの両方finalization
が、Windows によって特定のことが妨げられる状態で実行されます。