1

グローバル変数を無差別に使用するのは賢明ではないことは承知しています。ただし、TStringList を使用する必要がありました。私の質問は、どのように(そしてどこで)それを解放するのですか? 検索しましたが、それに関するドキュメントは見つかりませんでした。

ありがとう。

4

2 に答える 2

4

これは、メモリ管理の基本原則である Single Ownership Principleを念頭に置くことで解決できます。すべての変数には、クリーンアップを担当する単一の所有者が必要です。

作成するコードが何であれ、適切なタイミングTStringListでそれを破棄する (そして、それがグローバルの場合は、グローバル変数をnilに設定する) 責任も負う必要があります。では、どこで作成していますか?

一般に重要なリソースを表すグローバルがある場合、それらは通常、プログラム全体を管理するオブジェクトによって設定されます。これらは初期化時に作成され、メイン オブジェクトの破棄中にクリーンアップされます。一方、initializationユニットのセクションで作成する場合は、クリーンアップを同じユニットのfinalizationセクションに配置する必要があります。

于 2013-10-04T19:08:52.497 に答える
2

TStringList は、安全に初期化し、セクションinitializationで解放する必要がありfinalizationます。

推奨事項として、グローバル変数へのアクセスを関数にカプセル化することを検討してください。これにより、var 宣言をimplementationパーツに移動し、それをより詳細に制御できます。

initializationその他の場合はandfinalizationが不適切な場合があることに注意してください。特に、スレッドが関係している場合やLoadLibrary() / FreeLibrary()呼び出しが必要な場合は、通常のプログラム フローで専用の手順を使用することをお勧めします。initializationセクションとセクションの両方finalizationが、Windows によって特定のことが妨げられる状態で実行されます。

于 2013-10-04T19:09:11.017 に答える