【问题标题】:Why is Bitmap Scan0 still valid after unlocking?为什么Bitmap Scan0在解锁后仍然有效?
【发布时间】:2017-07-05 07:44:48
【问题描述】:

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

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 仍然可以操作。 我的猜测是底层位图驻留在非托管内存上。

【问题讨论】:

  • 当然可以在UnlockBits之后进行操作,但不能保证。它可能会也可能不会。

标签: c# pointers bitmap


【解决方案1】:

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

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

该系统并非旨在在您解锁时立即使内存 100% 失效。锁给了你一个指针,并承诺在你解锁之前,该指针将保持有效。

但事实并非如此。系统不保证解锁后指针立即变为无效

但这也不意味着你可以到处使用它。你已经告诉系统你已经完成了指针。现在,它可以随时随意移动、使其无效,随心所欲。如果你继续使用它,你就是在玩火。

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

【讨论】:

    猜你喜欢
    • 2020-08-02
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    • 2014-05-21
    • 1970-01-01
    • 2015-12-01
    • 1970-01-01
    • 2011-10-02
    相关资源
    最近更新 更多