他のポスターが指摘したように、これらのオブジェクトは明示的に解放する必要があります。Ray が示したように、これは通常、try..finally ブロックを使用して手動で行われます。ただし、知っておくべき例外があります。
コンポーネント (TComponent の子孫) は、そのコンストラクタに Owner パラメータを渡します。所有者がnilでない場合、所有者コンポーネントは新しいコンポーネントの所有権を取得し、解放されるとそれを解放します。これが、独自のフォームをクリーンアップする必要がない理由です。それらは Application オブジェクトに接続されており、プログラムの終了時に自分自身を解放する方法を知っています。ただし、実行時にコンポーネントを作成する場合は、所有者を割り当てるか、コンストラクターに nilを渡してから自分で解放する必要があります。コンポーネントを所有者で解放することによって、2 つを混在させないでください。 これにより、特定の状況下でダブルフリー状態が発生する可能性があります。
参照カウントを実装するインターフェース化されたオブジェクト (主に TInterfacedObject の子孫) は、(オブジェクトとしてではなく) 明確にインターフェースとして参照すると、参照カウント メカニズムによって解放されます。これらのオブジェクトへの最後のインターフェース参照が削除されると、それらは自動的に解放されます。すでにインターフェイス参照に割り当てている場合は、TInterfacedObject を手動で解放しないでください。これにより、例外が発生します。また、インターフェイスを持つすべてのオブジェクトが参照カウントを実装しているわけではないことに注意してください。ほとんどの場合、TInterfacedObject から派生したものだけです。
オブジェクトを作成し、try..finally ブロックを使用してから解放することは、必ずしも実用的ではありません。特に、オブジェクトをある種のリストに割り当てている (そしてそれらを大量に作成している) 場合は特にそうです。その場合は、TObjectList (または、OwnsObjects プロパティがtrueに設定された D2009 (TObjectList) をお持ちの場合はさらに良いでしょう。これにより、リストはその中のオブジェクトの所有者になり、コンポーネントが解放されるのと同じように、解放されると解放されます。繰り返しますが、オブジェクト リストによって所有されている場合は、オブジェクトを手動で解放しないでください。
動的配列 (文字列を含む) は、参照カウント システムを使用してコンパイラによって管理され、他のほとんどの型の変数はスタックに割り当てられます。ポインターをいじっていない限り、オブジェクト以外のものを手動で解放することを心配する必要はありません。
これはおそらく複雑に聞こえるかもしれませんが、すぐに慣れるでしょう。すべてのオブジェクトは、別のオブジェクト、インターフェイス参照カウント システム、またはコードのいずれかによって所有されていることを覚えておいてください。所有者は、不要になったオブジェクトをすべて解放する必要があります。他の何かによって所有されているものを解放しようとするべきではありません。(盗んではいけません。) これらのガイドラインを覚えておけば、適切なメモリ管理ができるようになります。DPR のメイン ルーチンで "ReportMemoryLeaksOnShutdown := true" を設定することもできます。