Стек, куча и сборщик мусора

Название может быть немного неверным, но, тем не менее, речь идет о Stack & Heap и сборщике мусора.

Мой код:

    static void Main(string[] args)
    {
        MyInt x = new MyInt();
        x.MyValue = 3;
        MyInt y = new MyInt();
        y = x;
        y.MyValue = 4;
        Console.Read();
    }

    public class MyInt
    {
        public int MyValue;
    }

Мой вопрос:

Правильно ли я понимаю, что сначала y был создан с указателем на новый MyInt в памяти, а затем указатель y был заменен указателем x, и теперь y указывает на тот же объект (правильно ли он называется объектом?), что и x в памяти?

И что объект y, который был создан до этого, остался в куче без какого-либо указателя на него? Что он существует в куче, но никто не указывает на этот объект в памяти. И что теперь этот объект подлежит сборщику мусора?

Я правильно понимаю?


person Ailayna Entarria    schedule 12.12.2013    source источник
comment
да вроде примерно так   -  person Guru Stron    schedule 12.12.2013
comment
"все равно" - это одно слово :)   -  person Alex    schedule 12.12.2013


Ответы (2)


Да, ты прав. И хорошо, что вы можете доказать это, используя WeakReference.

WeakReference — это объект, который отслеживает другую ссылку, но не препятствует ее сбору. Это позволяет вам в любое время проверить целевую ссылку и посмотреть, была ли она уже собрана:

private static void Main(string[] args)
{
    MyInt x = new MyInt();
    x.MyValue = 3;
    MyInt y = new MyInt();
    WeakReference reference = new WeakReference(y);
    Console.WriteLine("Y is alive: " + reference.IsAlive);
    y = x;
    y.MyValue = 4;
    Console.WriteLine("Y is still alive: " + reference.IsAlive);
    Console.WriteLine("Running GC... ");
    GC.Collect(2);
    GC.WaitForFullGCComplete();
    Console.WriteLine("Y is alive: " + reference.IsAlive);
    Console.Read();
}

Этот код подтверждает вашу точку зрения, вывод ниже:

Y is alive: True
Y is still alive: True
Running GC...
Y is alive: False
person Baldrick    schedule 12.12.2013

Да, ваша интерпретация верна. Сначала переменные x и y указывают на разные значения - a и b соответственно. Затем они указывают на одно и то же значение a. Следовательно, нет сильных ссылок на b, поэтому его можно выбрать для сборки мусора.

person dcastro    schedule 12.12.2013