C#:重新推出数组

时间:2014-01-16 06:42:49

标签: c# arrays garbage-collection

假设我有以下只分配数组的类:

public class ArrayAllocator
{
    private int[] _arr;

    public int [] Allocate(uint size)
    {
        _arr = new int[size];
        return _arr;
    }
}

然后我会这样使用:

ArrayAllocator allocator = new ArrayAllocator();
int [] result;
result = allocator.Allocate(10); // create space for 10 ints
result = allocator.Allocate(20); // create space for 20 ints, using the same pointer

当我使用相同的指针_arr进行下一次分配并且在运行时释放内存时,GC是否知道我已经完成了最初的10个整数?

由于

1 个答案:

答案 0 :(得分:2)

当您使用Allocate函数时,_arr指向内存中的新位置,如果没有指向您之前的_arr(内存指针)的实时实例,那么内存适用于GC,因为没有更多的实时引用可以找到指向旧内存。

请记住:当标记中不存在可以访问该对象的实时引用时,GC会标记适用于垃圾收集的对象。

编辑所以你的问题

  

当我使用相同的指针_arr进行下一次分配并且在运行时释放内存时,GC是否知道我已经完成了最初的10个整数?

有一个简单的答案, YES 它知道旧数组指向的内存,没有更多指向它的实时引用,它将被标记为Garbage,并且将很快重新收集内存。