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