我正在编写图像处理方法,并且在不安全的上下文中对固定指针有一些困惑。通常,我们会使用fixed
关键字与addressof
运算符&
一起修复指针。
fixed (int* p = &pt.x) // Common example does not seem to apply in my case.
使用Bitmap.LockBits
时,我们会获得IntPtr
返回的BitmapData.Scan0
。
using (var bitmap = new Bitmap(800, 600))
{
var data = bitmap.LockBits(new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
// Error: You cannot use the fixed statement to take the address of an already fixed expression.
fixed (void* p = data.Scan0.ToPointer()) {...}
// Works fine but does [byte* p] remain fixed?
byte* p = (byte*) data.Scan0.ToPointer();
bitmap.UnlockBits(data);
}
问题是,我们是否需要在此上下文中使用fixed关键字?如果没有,byte* p
如何不受GC的影响?
答案 0 :(得分:1)
此处您不需要fixed
。哪个是幸运的,因为编译器不会让你无论如何都使用它。 :)
对LockBits()
方法的调用是内存块的引脚。这就是说文档中的方法:
将位图锁定到系统内存
稍后调用UnlockBits()
取消它(这就是为什么你应该将该调用放在finally
块中。)