struct a
{
public string str;
}
a bb = new a();
class a
{
public string str;
}
a bb = new a();
クラスは常にガベージコレクションされると言うのは正しいですか? 構造体はメモリに (永久に) 保持されますか?
struct a
{
public string str;
}
a bb = new a();
class a
{
public string str;
}
a bb = new a();
クラスは常にガベージコレクションされると言うのは正しいですか? 構造体はメモリに (永久に) 保持されますか?
はい。struct
が参照型のオブジェクトのフィールドの場合、ヒープに格納され、ガベージ コレクションの対象になります。
編集->コメントに関する議論に続いて回答が更新され、ロブが共有するリンク
struct
値型です。通常、ヒープ上に個別のメモリは割り当てられません。通常、ガベージ コレクションは必要ありません。
ただし、例外があります。メモリ割り当ては、値型に割り当てられたスタックまたは参照型に割り当てられたヒープであるとは限りません。詳細については、他の SO の質問に対するこの回答と実装の詳細のスタックをお読みください。
メンバー変数として何らかの参照型がある場合struct
、参照型は (次のガベージ コレクション トリガーで) ガベージ コレクションさstruct
れます。
あなたの例では、参照型string
として使用しています。intern poolを使用して異なる方法で処理されます。String
構造体の例で文字列がメモリに残るかどうかという質問の場合、答えはノーです。構造体のメンバーは、他のオブジェクトと同様に、スコープを離れるとガベージ コレクションの対象になります。
.NET GC は、マーク アンド スイープ アプローチを使用して、スタック上の静的フィールド、既存のオブジェクト、およびローカル変数によってポイントされているオブジェクトを調べます。
ローカル変数の構造体はスタック上にあるため、通常どおりスイープされます。ヒープ上のオブジェクト メンバーの構造体も、GC がオブジェクト ツリーを通過するときにスイープされます。静的メンバーについても同様です。
つまり、構造体はクラスと同じ方法でスイープされます。それらの唯一の違いは、それらの保管方法です。構造体は変数ごとに保存されますが、クラスは参照として保存されます。どちらの方法も GC の対象です。
私が正しく知っていれば、はい、C#では両方ともガベージコレクトされています。
ヒープに保存するかスタックに保存するかは、型ではなく変数/インスタンスの有効期間に依存します。
考慮すべきことの 1 つは、サブスクライブされたイベント ハンドラーなどのより複雑な状況がクラスのインスタンスに存在する場合です。その場合、ガベージ コレクターは収集をスキップし、インスタンスはメモリに存在する可能性があります。ただし、文字列型が 1 つしか宣言されていないため、上記の例はおそらく収集されます。