2013-08-08 2 views
0

Я создал приложение форм форм для форм, которое содержит две формы - form1 и form2.Утечка памяти в ShowDialog даже после ее удаления

Форма 1 содержит кнопку и по щелчку Я показываю форму2 как диалоговое окно, как показано ниже.

private void button1_Click(object sender, EventArgs e) 
     { 
      Form2 form2 = new Form2(); 
      try 
      { 
       form2.ShowDialog(); 
      } 
      catch (Exception ex) 
      { 

      } 
      finally 
      { 
       if (form2 != null) 
       { 
        form2.Dispose(); 
        form2 = null; 
       } 
      } 

     } 

Затем я проверил приложение, например, нажмите кнопку, затем он откроет форму2, закроет ее. и продолжил это примерно 6 раз.

Когда я проверил приложение с DevPartner, он всегда показывает Form2 form2 = new Form2();, как утечка

Когда я проверил в сети он говорит, что если мы используем ShowDialog нам нужно расположить форму после того, как мы его закрытия , то есть, почему я попытался избавиться от блока finally. Но все же он показывает эту линию как утечку. Может кто-нибудь, пожалуйста, дайте свои предложения по этой утечке.

+0

Я всегда использую используя блок вокруг моих форм, которые используют диалог шоу, вы пробовали это? – Sayse

+0

Обычно я не придерживаюсь такого стиля, как удаление формы. Почему бы не попробовать помещать этот код Dispose в кнопку, присутствующую в форме2? –

+0

@Sayse: да изначально я попробовал это с помощью .. но не повезло .. –

ответ

0

Вы должны исследовать свой Form2, чтобы найти какие-либо подсекции для внешних событий и корневых референций. Все они должны быть удалены по форме.

В следующем коде знаками утечки являются подписка на событие Idle. Подписка удаляется в методе Dispose, чтобы избежать утечки.

Form2() 
{ 
    Application.Idle += Application_Idle; 
} 

void Application_Idle(object sender, EventArgs e) 
{ 
} 

protected override void Dispose(bool disposing) 
{ 
    if (disposing) 
    { 
     Application.Idle -= Application_Idle; 
    } 
} 
+0

Покажите мне способ добавить это в комментарий –

+0

Извините, да, я исправил первую часть ответа, чтобы предотвратить потерю контекста –

+0

Нет формы пуста, в форме нет записей и подписей. –

0

Как правило, при использовании IDisposable объекта, вы должны объявить и создать его экземпляр в используя заявление. Оператор , использующий оператор, вызывает метод Dispose на объекте правильным образом, а также сам объект выходит из области действия, как только вызывается Dispose. Внутри используемого блока объект доступен только для чтения и не может быть изменен или переназначен.

Оператор using гарантирует, что Dispose вызывается, даже если исключение возникает, когда вы вызываете методы на объекте.

0

Это, вероятно, правила проверки вашего инструмента, поскольку создание экземпляра не входит в try-catch.

Попробуйте так:

private void button1_Click(object sender, EventArgs e) { 
    Form2 form2; 
    try { 
     form2 = new Form2(); 
     form2.ShowDialog(); 
    } finally { 
     if (form2 != null) { 
      form2.Dispose(); 
      form2 = null; 
     } 
    } 
} 

Или еще проще:

private void button1_Click(object sender, EventArgs e) { 
    using (var form2 = new Form2()) { 
     form2.ShowDialog(); 
    } 
} 
+0

Есть ли разница между моим кодом и вашим первым образцом? Даже если мы создадим экземпляр form2 вне блока try, я думаю, что тогда он будет удален в последнем блоке. –

+0

Верно, но если ваш Form2 выдает исключение в конструкторе, он не будет удален. На что жалуется ваш инструмент. – Maarten

+0

Хорошо. Как я уже сказал, форма 2 не содержит никакого контроля. –