为什么GC堆上的托管指针会使JIT编译器崩溃?

时间:2017-11-22 11:15:14

标签: c# .net visual-studio garbage-collection clr

我一直在阅读docs for the new C# 7.2 update,而且我不确定我是否了解了ref struct声明部分特定部分的含义。 这是:

  

[...]另外,在GC堆上放置托管指针通常会在JIT时崩溃。

这究竟是什么意思?让我们说我有这样的事情:

IntPtr ptr = Marshal.AllocHGlobal(sizeof(float) * 100);
float* pt = (float*)ptr.ToPointer();
Parallel.For(0, 10, i => 
{ 
    for (int j = 0; j < 10; j++) pt[i * 10 + j] = i * 10 + j;
});

或另一个例子:

float[,] m = new float[10, 10];
fixed (float* pt = m) // I know I could put this inside the lambda, but this
{                     // way the pointer should be captured by the closure
                      // and therefore end up on the GC heap
    Parallel.For(0, 10, i => 
    { 
        for (int j = 0; j < 10; j++) pt[i * 10 + j] = i * 10 + j;
    });
}

我假设在这两种情况下都会捕获float*指针并将其存储在闭包内的GC堆上,所以:

  • 这些案例中的任何一个(或两个)会导致问题吗?
  • 这是该段所讨论的内容,还是那种不同的情况?
  • 如果是这种情况,为什么这样会导致JIT编译器崩溃?

谢谢!

0 个答案:

没有答案