“固定”的内部工作:处理内存位置或对象?

时间:2013-02-06 08:58:46

标签: c# arrays fixed unsafe

在托管/非托管阵列互操作性方面,我有一个没有通常的案例

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

另外一个问题:

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

1 个答案:

答案 0 :(得分:3)

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

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

来自msdn

  

fixed语句设置指向托管变量和“引脚”的指针   在执行语句期间的那个变量。没有固定,   从那以后,指向可移动托管变量的指针几乎没用   垃圾收集可以无法预测地重定位变量。 C#   编译器只允许您指定一个托管变量的指针   固定陈述。