gpt4 book ai didi

c# - 内存泄漏和处置

转载 作者:行者123 更新时间:2023-11-30 19:44:23 31 4
gpt4 key购买 nike

可能是我没有理解概念或者我做错了什么。我对 .NET 中的内存管理有一些疑问。

想象一下情况:

Form1 是大人物 Form,作为 MDI 父级和一个小 FormChild,作为子级绑定(bind):

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void simpleButton1_Click(object sender, EventArgs e)
{
FormChild formChild = new FormChild();

formChild.MdiParent = this;
formChild.Show();

}
}

现在 child 正在分配一点内存作为模拟:

public partial class FormChild : Form
{
private readonly List<byte[]> _list = new List<byte[]>();

public FormChild()
{
InitializeComponent();


}

private void FormChild_Load(object sender, EventArgs e)
{
int i = 0;
while (i < 100)
{
_list.Add(new byte[1024 * 1024 * 10]);
i += 1;
}

}

}

现在,我正在使用内存分析器检查内存堆中发生了什么。我明白了,如果我点击按钮,内存就被分配了。然后我关闭 FormChild 并调用 Dispose()。但是内存仍然分配。如果我再次单击 System.OutOfMemoryException 发生。

为什么 GC 等待释放托管内存?还是我的设计失误?

最佳答案

GC只是为了应对内存压力而释放内存,Dispose的主要目的是清理非内存相关的资源。

换句话说,清空托管对象不一定会使它们更快地被收集,但会更容易诊断内存问题。

关于c# - 内存泄漏和处置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12482176/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com