有人可以解释一下为什么下面的 C# 代码不会崩溃吗?为什么 Visual Studio 实际上允许编译它?我的理解是我得到了一个固定的指针,但它仅在“固定”语句中是固定的。当指针从'Foo'函数返回时,可以收集数组'ar'。然后我强制 GC 实际执行此操作,但连续写入内存(现在已解除分配)不会导致任何错误。
class Program
{
static unsafe byte* Foo()
{
byte[] ar = new byte[100];
fixed (byte* ptr = ar)
{
return ptr;
}
}
static unsafe void Main(string[] args)
{
byte* ptr = Foo();
GC.Collect();
for (int t = 0;;++t) ptr[t%100] = 0;
}
}