このコード行は、ヒープ上のメモリ領域をオブジェクト foo に割り当てます。
var foo =new object();
このコード行はそれを解放しますか?
foo=null;
それとも、ヒープ上のメモリ位置への参照を消去しているだけですか。
このコード行は、ヒープ上のメモリ領域をオブジェクト foo に割り当てます。
var foo =new object();
このコード行はそれを解放しますか?
foo=null;
それとも、ヒープ上のメモリ位置への参照を消去しているだけですか。
参照を削除するだけです。オブジェクト自体は、ランタイムが適切と判断したときにガベージ コレクションされ、参照が消去されるかどうかとは実際には無関係です。
C# では、すべてのオブジェクトがガベージ コレクションされるため、それらを「削除」することはできません。
特定のオブジェクトへの最後の参照が範囲外になると、そのオブジェクトは収集されやすくなります。確かに、見つけられる限り多くの参照を null にすることができますが、参照がそのオブジェクトを保持している限り、オブジェクトは存続します。
したがってfoo=null;
、参照を削除するだけです。
ガベージ コレクションは、次の手順で構成されます。
- ガベージ コレクターは、マネージ コードで参照されているマネージ オブジェクトを検索します。
- ガベージ コレクターは、参照されていないオブジェクトをファイナライズしようとします。
- ガベージ コレクターは、参照されていないオブジェクトを解放し、それらのメモリを再利用します。
ガベージ コレクターがどのように機能するかを理解することが重要ですGC クラス
// Set a break-point here to see that foo = null.
// However, the compiler considers it "unassigned."
// and generates a compiler error if you try to
// use the variable.
object foo;
// Now foo has a value.
foo = new object();
// Set foo to null again. The object it referenced
// is no longer accessible and can now be garbage-collected.
foo = null;