2010-01-05 33 views
6

Tôi đã đăng câu hỏi cách đây không lâu về cách chương trình của tôi cơ bản bị rò rỉ bộ nhớ: xem here. Bây giờ tôi đã theo dõi nó cụ thể cho một số mã trong đó tôi sao chép các byte thô của một đối tượng Bitmap vào một mảng được quản lý. Mã liên quan:Sử dụng an toàn Marshal.Copy từ dữ liệu bitmap thô đến mảng được quản lý

public class FastBitmap 
{ 
    ... 
    private byte[] rgbValues; 
    private int height; 
    private int width; 
    private Bitmap image; 

    public FastBitmap(Bitmap plainBitmap) 
    { 
     width = plainBitmap.Width; 
     height = plainBitmap.Height; 
     image = new Bitmap(plainBitmap); 
     LockPixels(new Rectangle(0, 0, image.Width, image.Height)); 
    } 

    private void LockPixels(Rectangle area) 
    { 
     if (locked) 
      return; 
     locked = true; 
     BitmapData bitmapData = image.LockBits(area, ImageLockMode.ReadWrite, 
           PixelFormat.Format24bppRgb); 
     IntPtr ptr = bitmapData.Scan0; 
     int stride = bitmapData.Stride; 
     int numBytes = image.Width * image.Height * 3; 
     rgbValues = new byte[numBytes]; 
     for (int r = 0; r < image.Height; ++r) 
     Marshal.Copy(new IntPtr((int)ptr + stride * r), 
          rgbValues, image.Width * 3 * r, image.Width * 3); 
    } 
} 

So thats tất cả các mức độ của mã mà gây ra bộ nhớ không được phục hồi, và tôi tưởng tượng nó có cái gì để làm với các Marshal.Copy() mặc dù tôi đã giả định rằng kể từ khi tôi sao chép từ một Bitmap (tự dọn dẹp?) vào một mảng được quản lý, không có vấn đề gì.

Vì vậy, câu hỏi: Có cần thiết để làm sạch đối tượng Bitmap, hoặc thông qua giao diện IDisposable hay tương tự. Điều gì (nếu có cái gì đó) vốn đã sai với việc sử dụng Marshal.Copy() trong tình huống này, và tôi có thể dọn dẹp vấn đề ở đâu?

Cảm ơn bạn

Chỉ cần để bạn biết tôi đã thử nghiệm đoạn mã sau, để xác minh rằng nó thực sự là gây ra điều này vấn đề:

Bitmap bmp = new Bitmap(1000, 1000); 
for (int n = 0; n < 100; ++n) 
{ 
    FastBitmap fb = new FastBitmap(bmp); 
} 

Vào lúc bắt đầu và kết thúc của chuỗi này tổng bộ nhớ mức sử dụng đã tăng lên khoảng 320MB và không biến mất, bất kể bạn đợi bao lâu.

Trả lời

8

Bạn đã quên gọi image.UnlockBits (bitmapData);

+1

Cảm ơn rất nhiều, giờ thất vọng và đơn giản như vậy. – DeusAduro

+0

Dường như bạn bỏ lỡ đoạn mã thứ hai, hàm 'UnlockBitmap' (gọi là' UnlockBits'), từ bài viết này: http://www.devx.com/webdev/Article/44658/1763/page/2 – rwong

Các vấn đề liên quan