2016-07-13 2 views
1

У меня есть приложение Windows Form. Когда я добавляю некоторые кнопки в форму динамически, а затем удаляет эти кнопки, происходит утечка памяти. ИспользованиеУтечка памяти динамического управления

public partial class Form1 : Form 
{ 
    private Button[] buttons = new Button[1000]; 

    private void button1_Click(object sender, EventArgs e) 
    { 
     for (int i = 0; i < 1000; i++) 
     { 
      var b = new Button(); 
      Controls.Add(b); 
      buttons[i] = b; 
     } 

     for (int i = 0; i < 1000; i++) 
     { 
      Controls.Remove(buttons[i]); 
      buttons[i].Dispose(); 
      buttons[i] = null; 
     } 
    } 
} 

Память:

  • После формы нагрузок: 3720 KB
  • После нажатия кнопки Button1:. 5144 KB

(Эти номера записаны после выполнения полного сбора мусора программы был запущен без отладчика, релиз сборки.)

Еще более странно, независимо от того, сколько раз выполняется функция button1_Click, использование памяти составляет около 5100 КБ. Что я делаю не так?

+4

Если память остается на уровне 5,1 мб, то утечки памяти нет. Обычно утечка означает, что она не останавливается в определенной точке. – Mikanikal

+0

Но почему использование памяти увеличивается после добавления, а затем удаления элементов управления? Это довольно странно для меня. – jetstream96

+1

Вы можете попробовать выполнить калибровку 'GC.Collect()'. Кроме того, попробуйте использовать профилировщик _memory_, например [ANTS Memory Profiler] (http://www.red-gate.com/products/dotnet-development/ants-memory-profiler). –

ответ

0

Это не утечка памяти. Прежде всего, если вы полагаетесь на диспетчер задач Windows для этого, это неправильно. Если вы действительно хотите измерить фактическую память своего приложения, попробуйте использовать некоторые счетчики производительности. Или, может быть, даже что-то вроде этого,

private Process currentProcess = System.Diagnostics.Process.GetCurrentProcess(); 
long totalBytesOfMemoryUsed = currentProcess.WorkingSet64; 

Во-вторых, даже если объекты, которые выделяются в куче собраны сборщиком мусора, после того, как они расположены, что не означает, что приложение будет выпускать нераспределенного Память. Это произойдет только в том случае, если операционная система запрашивает проводную память для других операций. Суть в том, что это не утечка памяти.

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