假设我有以下只分配数组的类:
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个整数?
由于
答案 0 :(得分:2)
当您使用Allocate
函数时,_arr
指向内存中的新位置,如果没有指向您之前的_arr
(内存指针)的实时实例,那么内存适用于GC,因为没有更多的实时引用可以找到指向旧内存。
请记住:当标记中不存在可以访问该对象的实时引用时,GC会标记适用于垃圾收集的对象。
编辑所以你的问题
当我使用相同的指针
_arr
进行下一次分配并且在运行时释放内存时,GC是否知道我已经完成了最初的10个整数?
有一个简单的答案, YES 它知道旧数组指向的内存,没有更多指向它的实时引用,它将被标记为Garbage,并且将很快重新收集内存。