堆栈&堆&垃圾收集器

标题可能有点不正确,然而它关于堆栈和堆和垃圾收集器没有那么少。

我的代码:

    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的对象现在是在堆栈之前创建的,没有指向它的指针? 它存在于堆中,但没有人在内存中指向这个对象。 那现在这个对象是垃圾收集器的主题?

我得到这个正确的?


你是对的。 而好的是你可以通过使用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

是的,你的解释是正确的。 首先,变量xy指向不同的值 - ab 。 然后他们指向相同的值a 。 因此,没有强烈的b引用,所以它可以被选为垃圾收集。

链接地址: http://www.djcxy.com/p/2227.html

上一篇: Stack & Heap & Garbage Collector

下一篇: Arrays, heap and stack and value types