2014-10-06 4 views
0

Я заметил, что моя программа текла память. Поэтому я использовал dotMemory, чтобы найти утечку, и похоже, что это функция вызывает утечку:Утечка памяти при Marshal.Copy

private void LoadBits() 
    { 
     // Lock the bitmap's bits. 
     Rectangle rect = new Rectangle(0, 0, bm.Width, bm.Height); 
     bmpData = bm.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, bm.PixelFormat); 
     stride = bmpData.Stride; 

     // Get the address of the first line. 
     IntPtr ptr = bmpData.Scan0; 

     // Declare an array to hold the bytes of the bitmap. 
     byteCount = Math.Abs(bmpData.Stride) * bm.Height; 
     bytes = new byte[byteCount]; 

     // Copy the RGB values into the array. 
     System.Runtime.InteropServices.Marshal.Copy(ptr, bytes, 0, byteCount); 
    } 

И это, как разблокировать биты.

private void SaveBits() 
    { 
     // Update Stuff 
     IntPtr ptr = bmpData.Scan0; 

     System.Runtime.InteropServices.Marshal.Copy(bytes, 0, ptr, byteCount); 
     bm.UnlockBits(bmpData); 
    } 

Я реализовал интерфейс IDisposable для этого класса. И я называю SaveBits там, поэтому, даже если я забыл позвонить SaveBits, GC должен сделать это для меня. И да, я вызываю bm.Dispose() и устанавливаю все значение null в методе Dispose.

+1

LoadBits и SaveBits используют разные переменные. один - '_bm', другой -' bm', вы могли бы разблокировать биты на неправильном объекте? Также можно было бы вызывать 'LoadBits()' более одного раза, прежде чем вызывается 'SaveBits()', что также приведет к утечке памяти. Попытайтесь положить 'bmpData = null' в конец' SaveBits() 'и поместить' if (bmpData! = Null) бросить новый InvalidOperationException(); 'в начале' LoadBits() 'и посмотреть, будет ли выбрано исключение. –

+0

Я реорганизовал после того, как я разместил вопрос. Таким образом, «LoadBits» показывал старые имена var. Позвольте мне обновить его. – Trauer

+1

Если вы делаете нулевую проверку и выдаете исключение, не бросает ли она? –

ответ

2

После этого вы должны сделать UnlockBits().

+0

Я уже это делаю. Не помогло. – Trauer

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