为什么解锁后Bitmap Scan0仍然有效?

时间:2017-07-05 07:44:49

标签: c# pointers bitmap

据我所知,在托管环境中没有指针的概念,垃圾收集器负责内存管理。就像有人想操纵位图中的像素值一样,她/他必须先锁定它,就像下面的代码一样。

Bitmap Image = new Bitmap(width, height, 
                   System.Drawing.Imaging.PixelFormat.Format8bppIndexed);
Rectangle rect = new Rectangle(0, 0, width, height);
BitmapData bmpData = Image.LockBits(rect, ImageLockMode.ReadWrite, 
PixelFormat.Format8bppIndexed);
IntPtr imageScan0 = bmpData.Scan0;
unsafe
{
    byte* ptr = (byte*)imageScan0;
    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            *ptr++ = 128;
        }
            }
        }
Image.UnlockBits(bmpData);

我的主要问题是: 如果我存储imageScan0信息然后解锁位图,我仍然可以使用imageScan0来操纵它的值,就像我在锁定和解锁操作之间操作它一样。

我测试了它,我很惊讶地看到imageScan0仍然可以操作。 我的猜测是底层位图驻留在非托管内存上。

1 个答案:

答案 0 :(得分:0)

  

我的主要问题是:如果我存储imageScan0信息然后解锁位图,我仍然可以使用imageScan0来操纵它的值,就像我在锁定和解锁操作之间操作它一样。

你可以。但这并不意味着你可能

系统只是设计为在解锁时100%立即使内存无效。锁给了你一个指针,并承诺在解锁之前的持续时间内,指针仍然有效。

但反过来却不是这样。解锁后,系统不保证指针会立即变为无效

但这并不意味着你可以四处使用它。你告诉系统你完成了指针。它现在可以自由移动它,使它无效,无论它想要什么。如果继续使用它,你就会玩火。

指针在解锁后保持有效不是问题。 是您使用它的问题;这是你的工作,以确保你没有,而不是系统的。