【问题标题】:Marshal - Do I need to free any resources?Marshal - 我需要释放任何资源吗?
【发布时间】:2014-02-02 18:05:06
【问题描述】:

我正在使用以下方法将byte[] 转换为Bitmap

    public static Bitmap ByteArrayToBitmap(byte[] byteArray)
    {
        int width = 2144;
        int height = 3;
        Bitmap bitmapImage = new Bitmap(width, height, PixelFormat.Format32bppPArgb);
        BitmapData bmpData = bitmapImage.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format32bppPArgb);
        IntPtr ptr = bmpData.Scan0;

        try
        {
            Marshal.Copy(byteArray, 0, ptr, byteArray.Length);
            bitmapImage.UnlockBits(bmpData);
            return bitmapImage;
        }
        finally
        {
           //Marshal.FreeHGlobal(ptr); //Do I need this?
        }
    }

只是想知道我是否需要在这里释放任何资源? 尝试调用Marshal.FreeHGlobal(ptr),但我收到此错误:

对内存位置的访问无效。

谁能指导一下?

另外,仅供参考,我可以使用MemoryStreambyte[] 中获取Bitmap,但在这种情况下我得到了“参数无效”异常。这就是为什么选择Marshal 的原因。

【问题讨论】:

    标签: c# bitmap marshalling


    【解决方案1】:

    只有在使用 AllocHGlobal 时才使用 FreeHGlobal。你没有所以不叫它。您确实分配了非托管内存,它是由new Bitmap 完成的。这是由 Dispose() 或 GC 发布的。之后。

    你当然应该使用 finally 块,这就是你调用 UnlockBits() 的地方。这会“释放”指针。

    【讨论】:

      【解决方案2】:

      不,你不需要。

      为位图分配的内存由 Bitmap 构造函数分配,并且在处理 bitmapImage 时将被释放。

      【讨论】:

        【解决方案3】:

        您唯一应该做的就是确保在返回的Bitmap 上调用 dispose。最好的办法是把它放在using 块中。

        using(Bitmap myBitmap = ByteArrayToBitmap(someArray)
        {
           //...
        }
        

        【讨论】:

        • 嗯,你确定吗,你正在处理返回的对象。
        • @ScottChamberlain 你说得对,我错过了。我试图删除答案,但您无法删除已接受的答案...
        • 我知道您在哪里尝试编辑您的编辑,我做了一些更改以使其更加清晰。如果我错了,请回滚。
        猜你喜欢
        • 2010-09-08
        • 1970-01-01
        • 1970-01-01
        • 2023-01-05
        • 1970-01-01
        • 2023-01-08
        • 2012-01-22
        • 2013-07-31
        • 1970-01-01
        相关资源
        最近更新 更多