例を示した後、質問する方が簡単です...
MyClass a = new MyClass();
a.initializeData();
a = new MyClass();
新しいMyClassにスペースを割り当てた後、以前の割り当てはどうなりますか?C#に削除がないことがわかっているので、ガベージコレクターは自動的にそれを収集しますか?
メモリリークが発生しないようにしたいだけです。
ありがとう!
例を示した後、質問する方が簡単です...
MyClass a = new MyClass();
a.initializeData();
a = new MyClass();
新しいMyClassにスペースを割り当てた後、以前の割り当てはどうなりますか?C#に削除がないことがわかっているので、ガベージコレクターは自動的にそれを収集しますか?
メモリリークが発生しないようにしたいだけです。
ありがとう!
まず、「クラスの再割り当て」ではなく、「オブジェクトの作成」と呼ばれます。
ガベージコレクションの全体的な考え方は、参照のないオブジェクトがどうなるかは気にしないということです。つまり、(理由の範囲内で)無限のメモリがあるかのようにコーディングします。ガベージコレクタの目的は、メモリを解放することではなく、無限の量のメモリがあることをシミュレートすることです。
これを行うために、ガベージコレクターが、参照を保持していない以前に割り当てられたメモリを再利用する場合があります。また、使用済みメモリを再編成して断片化を防ぎ、すべての参照を更新して新しいメモリ位置を指すようにする場合もあります。これらはすべて、気にする必要のない実装の詳細です。
もちろん、GCがどのように機能するかを学ぶことは非常に興味深いことです。:)
孤立したクラスのメモリは、後でガベージ コレクターから割り当て解除されます。
この記事を見る
後で収集される最初のインスタンスへの参照がないため、ガベージ コレクターは参照を追跡しています。
プログラムが十分に長く実行され、将来のある時点で十分なメモリ プレッシャが発生するか、明示的なガベージ コレクションが発生すると仮定すると、 の最初のインスタンスMyClass
が収集されます (ファイナライザがある場合は、ファイナライザ キューに置かれます)。
これがいつ起こるか心配する必要はありません。最も早く発生する可能性があるのは、そのメソッドが(暗黙的または明示的に)initializeData
経由でインスタンス メンバーへのアクセスを停止した後、実行中です。this
明示的なガベージ コレクション: 特定の GC 動作を示すベンチマークやコード以外では、これを実行する必要はありません。
はい、ガベージ コレクターは未使用のオブジェクトを削除します。
これがいつ発生するかは保証されていませんが、存続期間が短いオブジェクトであるため、通常は次のガベージ コレクションで発生します。
オブジェクトがいつクリーンアップされるかを制御する必要がある場合 (つまり、クラスでアンマネージ リソースを使用する場合)、IDisposable
インターフェイスを実装し、Dispose
メソッドを呼び出してオブジェクトにリソースをクリーンアップするように指示します。