2014-02-02 3 views
6

Я использую ниже метод для преобразования 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), но я получаю эту ошибку:

Invalid access to memory location.

Может кто-нибудь, пожалуйста, руководство?

Кроме того, FYI, я мог бы использовать MemoryStream, чтобы получить Bitmap из byte[], но в то время я получал исключение «Параметр недействителен». Именно поэтому маршрут прошел до Marshal.

ответ

1

Единственное, что вы должны сделать, это убедиться, что вы вызываете утилизацию по возвращенному Bitmap. Лучший способ сделать это - разместить его в пределах using блока.

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

Ум, вы уверены в этом, вы удаляете объект, который возвращается. –

+0

@ScottChamberlain Вы правы, я пропустил это. Я попытался удалить ответ, но вы не можете удалить принятый ответ ... – MarcinJuraszek

+1

Я вижу, что вы пытаетесь сделать с вашим редактированием, я сделал несколько изменений, чтобы сделать его более ясным, надеюсь. Если я ошибаюсь, откажитесь. –

2

Нет, вам не нужно.

Память, выделенная для растрового изображения, выделяется конструктором Bitmap и будет освобождена, когда битмап-интерфейс будет удален.

3

Вы используете только FreeHGlobal, когда используете AllocHGlobal. Вы этого не называли. Вы выделили неуправляемую память, это было сделано new Bitmap. Это выпущено Dispose() или GC. Позже.

Вы обязательно должны использовать этот блок finally, вот где вы вызываете UnlockBits(). Это «освобождает» указатель.

Смежные вопросы