4

在托管/非托管数组互操作性中,我有一个没有通常的情况

fixed (byte* data = new byte[length])
{
    // work with the array
}

而是我想固定一个数组,我只得到一个参考,像这样:

IntPtr dataPtr = camera.Image2d.GetDataBuffer();
fixed (byte* data = (byte *)dataPtr)
{
   // work with the array
}

1)根据我的理解,底部代码也应该可以工作,因为“固定”会将内存位置固定在内存管理器中的低级别,而不关心指向它的任何对象?(意思是,我没有“根”/直接指针——即使可能没有任何这样的概念。)

还有一个问题:

2) 使用“固定”的要求来自与任何已执行代码同时运行的 CLR 内存管理器,因此它可以随时移动数组?

4

1 回答 1

3

1)第二个似乎不合适,因为使用fixed您试图固定指针的关键字,而不是实际的对象。IntPtr甚至不是(afaik)托管指针,而是非托管指针。

2)fixed创建一个指向指定托管变量的指针;如果没有 pinning,GC 可能会将变量重新定位到另一个内存位置,因此指针将变得无用。

来自msdn

固定语句设置一个指向托管变量的指针,并在语句执行期间“固定”该变量。如果没有固定,指向可移动托管变量的指针将几乎没有用处,因为垃圾收集可能会不可预测地重新定位变量。C# 编译器仅允许您在固定语句中分配指向托管变量的指针。

于 2013-02-06T09:12:19.327 回答