这是内存泄漏吗? Winforms隐藏和显示表单

时间:2014-12-03 10:42:59

标签: c# .net winforms forms memory-leaks

我使用以下代码隐藏表单并显示一个新表单(基本上,我想在两个表单之间切换)。但是每次我按下button2或button1,我的应用程序在任务管理器中的内存使用量就会增加。每次单击我的按钮时,此内存使用量都会增加,并且在Application.Exit()之前永远不会释放。这是某种内存泄漏吗?我是否错误地管理了表单?

非常感谢。

表格1:

Form2 pform2;
private void button2_Click(object sender, EventArgs e)
{

    if (form2 != null)
    {
        pform2.Show();
    }
    else
    {
        pform2 = new Form2();
        pform2.Show();
        this.Hide();
    }
    this.Hide();

表格2

Form1 pform1;
private void button1_Click(object sender, EventArgs e)
{

    if (form1 != null)
    {
        pform1.Show();
    }
    else
    {
        pform1 = new Form1();
        pform1.Show();
        this.Hide();
    }
    this.Hide();

2 个答案:

答案 0 :(得分:2)

如果您使用调试器,您将清楚地看到发生了什么。 问题是,每次单击该按钮时,都会创建Form1Form2的新实例。字段pform1例如。每次pform2为空,因此单击按钮时会创建一个新实例。

我认为你正在寻找这样的东西:

public class Main
{
  public Main()
  {
    var form = new Form1();
    form.ShowDialog();
  }
}

public class Form1 : Form
{
  private readonly Form2 _form2;

  public Form1()
    : this(null)
  {
    _form2 = new Form2(this);
  }

  public Form1(Form2 form2)
  {
    _form2 = form2;
    var button = new Button();
    button.Click += ButtonOnClick;
    Controls.Add(button);
  }

  private void ButtonOnClick(object sender, EventArgs eventArgs)
  {
    this.Hide();
    _form2.Show();
  }
}

public class Form2 : Form
{
  private readonly Form1 _form1;

  public Form2(Form1 form2)
  {
    _form1 = form2;
    var button = new Button();
    button.Click += ButtonOnClick;
    Controls.Add(button);
  }

  private void ButtonOnClick(object sender, EventArgs eventArgs)
  {
    this.Hide();
    _form1.Show();
  }
}

答案 1 :(得分:1)

根据您提供的代码:您不是在表单之间“切换”,您每次都在创建新表单

假设您在Form1并按下按钮。然后会创建并显示pform2,但由于您未将Form1实例传递给pform2 - 它会在pform1中为空,因此当您按下按钮时该表单将创建并显示Form1实例,等等.....