3

私はC#が初めてで、list1 = null;の後にlist1が本当にメモリから削除されるかどうか疑問に思っています。

List<string> list1 = new List<string>()
{
    "carrot",
    "fox",
    "explorer"
};
List<string> list2 = new List<string>();
list2.Add(list1[0]);
list2.Add(list1[1]);
list2.Add(list1[2]);

list1 = null;

このコードはドキュメンテーション専用です。私の実際のケースでは、list1 オブジェクトは非常に大きいため、メモリから削除する必要があり、元の list1 の一部である list2 のみを続行する必要があります。

list1[0] と list2[0] は、list2[0] を新しい値で更新するまで、メモリ内の同じオブジェクトを参照していると思います...それは正しいですか?

4

7 に答える 7

4

いくつかの質問があります。それらに個別に答えてみましょう:

  1. list1 への参照が null に設定されている場合、list1 はメモリから削除されますか?

    いいえ、次回ガベージ コレクターがヒープをクリーンアップするときに、リストはメモリから削除されます。このクリーンアップがいつ行われるかは、ガベージ コレクター次第です。

  2. list1 と list2 は同じオブジェクトを参照していますか?

    はい、そうです。

結論として、これはメモリ管理に対処する必要がないことを意味します。これは、ガベージ コレクターによって行われます。また、ガベージ コレクターは、孤立したオブジェクトをいつ収集する必要があるかを判断できるほどスマートです。したがって、GC よりもうまくやろうとしないでください。ほぼすべてのケースで悪化しています。

于 2012-07-12T09:12:25.343 に答える
2

C#はC /C++ではありません-直接のメモリ管理はありません。

リストオブジェクトにはアクセスできなくなり(それを使用するすべてのコードであると想定)、オブジェクトルートからアクセスできなくなります。これにより、GCは収集用にマークを付けることができます。

GCが収集すると、メモリは再利用されます。

于 2012-07-12T09:08:22.720 に答える
2

リストが削除されるという保証はありません。null を割り当てると、ガベージ コレクションの対象となり、GC が呼び出されるたびに収集されます。

MSDN から:

オブジェクトが破棄の対象になると、不特定の時点でオブジェクトのデストラクタ (存在する場合) が実行されます。明示的な呼び出しによってオーバーライドされない限り、オブジェクトのデストラクタは 1 回だけ実行されます。

オブジェクトのデストラクタが実行されると、そのオブジェクトまたはその一部が、デストラクタの実行を含む実行の継続によってアクセスできない場合、オブジェクトはアクセス不能と見なされ、オブジェクトはコレクションの対象になります。

最後に、オブジェクトがコレクションの対象になると、ガベージ コレクターはそのオブジェクトに関連付けられているメモリを解放します。

于 2012-07-12T09:09:48.053 に答える
2

さまざまな問題を考慮する必要があります。

于 2012-07-12T09:15:59.123 に答える
1

ガベージ コレクションが発生した時点で、そのメモリは回収されます。

詳細については、ガベージ コレクションの基礎を参照してください。(ガベージコレクションの条件)

于 2012-07-12T09:11:42.587 に答える
1

null への参照を保持してもメモリは削除されませんが、最終的にはガベージ コレクションが行われます。

GC 神話: オブジェクトの参照を null に設定すると、GC はすぐにそれを収集するように強制されます。

GC の真実: オブジェクトの参照を null に設定すると、GC がそれをより早く収集できる場合があります。

ここで詳細を読むことができます

于 2012-07-12T09:17:31.053 に答える
0

コードでは、list1とlist2は異なる場所を指しています。行の直前
の値を変更し、すぐにウィンドウをチェックインするだけで、の値は「fox」のままになります。list1[1] = "Something different"list1 = nulllist2[1]

ただし、使用する場合

List<string> list2 = list1;

その場合、list2[1]は「何か違う」になります。

注:どちらの場合も、list1 = nullにすると、list2には影響せず、値が含まれます。

于 2012-07-12T10:12:44.710 に答える