内存泄漏 - 在不处理“新CheckBox(...)”的情况下返回

时间:2012-11-21 10:38:22

标签: c# winforms memory-leaks

protected override void SetValueFromControl()
{
CheckBox checkbox = new CheckBox();

if (this.comboBox_Meta.SelectedItem != null)
{
    if (this.comboBox_Meta.SelectedIndex != 1)
    {
        checkbox.Checked = true;
    }
    else
    {
       checkbox.Checked = false;
    }

    this.my_Helper.SetValueFromCheckBox("xxx", checkbox);
}
}

我的ANT Profiler表示存在资源泄漏,如以下错误

  

在不处理“新CheckBox(...)”的情况下返回。

在我的SetValueFromCheckBox方法中,我使用以下条件。

some value = _checkbox.Checked;

注意:现在,在社区提供了有用的反馈之后,我添加了“使用”并等待下一次构建以进行错误验证。

4 个答案:

答案 0 :(得分:3)

不,错误意味着您应该致电Dispose

或将其包装在using块中:

using (var chk = new CheckBox())
{
    // your code
} // at this line `Dispose` is called automatically, even in case of exception

每个Windows窗体控件都会创建一堆未自动释放的句柄等。它们中的大多数仅在显示控件时创建,因此可能没有dispose调用,但由于分析器不知道它会抱怨。最好总是处理实现IDisposable的对象 - 你永远不知道实现是否会改变,对象将自己创建句柄。

文档:http://msdn.microsoft.com/en-us/library/system.idisposable.aspx

答案 1 :(得分:2)

null设置为实际处理它们是一种常见的误解。它不是。要处置CheckBox,请调用其Dispose方法。当您使用其他人建议的using语句时,会自动完成此操作。

但是,当您将控件实际添加到控件树时,这不是必需的!在这种情况下,当处理表格时,控件将被处理掉。

答案 2 :(得分:0)

这意味着您应该在其上调用dispose或使用using语句。

using(CheckBox checkbox = new CheckBox())
{

    if (this.comboBox_Meta.SelectedItem != null)
    {
        if (this.comboBox_Meta.SelectedIndex != 1)
        {
            checkbox.Checked = true;
        }
        else
        {
           checkbox.Checked = false;

        }

        this.my_Helper.SetValueFromCheckBox("xxx", checkbox);
    }
}

答案 3 :(得分:0)

创建动态控件时,最终可以将控件添加到控件树中。

如果不这样做,就没有意义去创造这样的控制。

不将控件添加到树控件的直接副作用是您将错过开箱即用的控件树。当控件被处理时(窗体在顶层),其子控件将被递归地处理。

其他人建议添加using声明,但我认为这是错误的。它将删除警告,但实际问题是您没有正确使用控件树。