将`fixed`关键字与`IntPtr.ToPointer`

时间:2015-07-10 00:32:32

标签: c# .net pointers garbage-collection keyword

我正在编写图像处理方法,并且在不安全的上下文中对固定指针有一些困惑。通常,我们会使用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的影响?

1 个答案:

答案 0 :(得分:1)

此处您不需要fixed。哪个是幸运的,因为编译器不会让你无论如何都使用它。 :)

LockBits()方法的调用是内存块的引脚。这就是说文档中的方法:

  

将位图锁定到系统内存

稍后调用UnlockBits()取消它(这就是为什么你应该将该调用放在finally块中。)