据我所知,在托管环境中没有指针的概念,垃圾收集器负责内存管理。就像有人想操纵位图中的像素值一样,她/他必须先锁定它,就像下面的代码一样。
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仍然可以操作。 我的猜测是底层位图驻留在非托管内存上。
答案 0 :(得分:0)
我的主要问题是:如果我存储imageScan0信息然后解锁位图,我仍然可以使用imageScan0来操纵它的值,就像我在锁定和解锁操作之间操作它一样。
你可以。但这并不意味着你可能。
系统只是设计为在解锁时100%立即使内存无效。锁给了你一个指针,并承诺在解锁之前的持续时间内,指针仍然有效。
但反过来却不是这样。解锁后,系统不保证指针会立即变为无效。
但这并不意味着你可以四处使用它。你告诉系统你完成了指针。它现在可以自由移动它,使它无效,无论它想要什么。如果继续使用它,你就会玩火。
指针在解锁后保持有效不是问题。 是您使用它的问题;这是你的工作,以确保你没有,而不是系统的。