在托管/非托管阵列互操作性方面,我有一个没有通常的案例
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内存管理器,它同时运行到任何已执行的代码,因此它可以随时移动数组?
答案 0 :(得分:3)
1)第二个看起来不合适,因为使用你试图固定指针的fixed
关键字而不是实际对象。并且IntPtr
甚至不是(afaik)托管指针,而是非托管指针。
2)fixed
创建指向指定托管变量的指针;如果没有固定,GC可能会将变量重定位到另一个内存位置,因此指针将变得无用。
来自msdn:
fixed语句设置指向托管变量和“引脚”的指针 在执行语句期间的那个变量。没有固定, 从那以后,指向可移动托管变量的指针几乎没用 垃圾收集可以无法预测地重定位变量。 C# 编译器只允许您指定一个托管变量的指针 固定陈述。