Delphi はメモリを自動的に管理します
Delphi のアトミック変数(Integer、Boolean、Record、Enumeration など)は、コンパイラによってスコープ内のメモリに自動的に割り当てられ、スコープ外になると自動的に解放されます。また、文字列、バリアント、動的配列、インターフェイスも同様です。これらも Delphi によって自動的に管理されます。
これらの変数は、インターフェイスを除いてすべてスタックに保存されます。さらに、Variant は VarArrayCreate などの関数を使用してプログラマによって手動で作成され、動的配列も SetLength などの関数を使用してプログラマによって手動で作成されますが、どちらの場合もプログラマが自分で解放する必要はありません。
さらに、別の種類の変数に注意する必要があります。それは、Threadvar を使用して宣言された変数であり、そのスコープはスレッドです。これは主に、各スレッドが 1 つのスレッドローカル ストレージを使用するようにスレッド関数を作成するときに使用されます。
プログラマが手動で管理するメモリ
ポインターとオブジェクトを使用するには、プログラマが手動でメモリを適用したり解放したりする必要があります。
ポインタには、PChar、ポインタ(型なしポインタ)、レコード ポインタ、変数ポインタ(アトミック変数へのポインタ)、関数ポインタ(グローバル関数とオブジェクト メソッドに分けられるコールバック関数など)が含まれます。 New 関数を使用してメモリを適用し、Dispose を使用してポインタを解放します。さらに、GetMem、ReallocMem、および FreeMem もメモリを申請および解放するための一連の関数です。GetMemoryManager 関数と SetMemoryManager 関数を通じて、Delphi の 3 つのメモリ管理関数を読み取って設定できます。
オブジェクトには、TObject と IUnknown という 2 つの継承ツリーから継承されたサブクラス オブジェクトが含まれます。オブジェクトはコンストラクター メソッドを使用して構築する必要があります。コンストラクター メソッド (通常は Create ですが、そうでない場合もあります。Delphi のコンパイラーはコンストラクター キーワードのみを認識します) を使用して作成されたオブジェクトの所有者を指定しない場合は、所有者を指定した場合でも、手動でオブジェクトを解放する必要があります。実際の状況を確認する必要があります。特定の時点でリリースする必要があります。一般に、解放には Free メソッドが使用されます (IUnknown では手動による解放は必要ありません)。より良い方法は、占有されたメモリを解放するだけでなく、ポインター自体も解放する FreeAndNil (Sysutils.pas ユニット内) を使用することです。
これらの変数はヒープに保存されます。注意が必要なもう 1 つの問題は、TList 内のポインタをプログラマ自身が解放する必要があることです。
注記:
1. コールバック関数はメモリ管理の技術範囲に属しません。詳細については、「ポインタ」セクションを参照してください。
2. オブジェクトの詳細については、「オブジェクト モデル」セクションを参照してください。
3. ポインタを複数の場所で使用している場合、そのうちの 1 つの場所を解放すると、他の場所で使用すると例外が発生します。 これは、ポインタを使用する際に注意すべき問題です。メモリの詳細については、「ポインタ」セクションを参照してください。
4. ポインタを渡すことには、メモリの節約と速度の向上という 2 つの明らかな利点があります。メモリの詳細については、「ポインタ」および「設計のヒント」セクションを参照してください。
5. オブジェクトとポインターを判断する方法は、非常に技術的なトピックです。csdn には、Aimingoo ([email protected]) によって書かれた「ポインターかどうかを検出する方法について」というタイトルの記事も掲載されています。記事「オブジェクトの徹底議論」です。メモリの詳細については、「ポインタ」および「オブジェクト」セクションを参照してください。
2004 年 1 月 19 日に完了。
不適切なコメントがあれば修正してください。