c#面板属性更改时存在内存泄漏

时间:2016-07-03 03:40:36

标签: c# winforms

function foo{T<:Type, S<:Type}(bar::T, arg::S) end

这是我的整个代码,我想知道为什么当我用事件处理程序(comboBox1_SelectedValueChanged)更改了组合框时发生了内存泄漏。我以为内存泄漏没有发生,因为我已经创建了面板并且只更改了面板属性(可见)。

1 个答案:

答案 0 :(得分:1)

内存增加并不表示托管内存中存在内存泄漏。只有在垃圾回收时才会回收内存。在此之前,内存使用量将增加。记忆&#34;泄漏&#34;当应该被垃圾收集的对象并没有真正死亡时(因为有一些非预期的活动引用),就会发生这种情况。

话虽如此,您仍应小心使用WinForms控件。因为它们实际上包装了本机Windows控件,所以它们声称来自Windows的控件句柄。调用控件的Dispose方法时释放此句柄。这可以(并且在大多数情况下会发生)在垃圾收集期间发生,但在此之前句柄不会返回到窗口(并且在垃圾收集期间没有100%保证diposal)。为了避免来自太多打开的Windows句柄的资源泄漏,您应该在不再需要它时立即处置WinForms控件。

处置Control也会处置其Controls集合中的所有子控件。由于您将两个面板添加到该集合中,因此您可能也很安全。