我一直在开发一个数据导出程序,该程序从数据库中提取一堆记录。其中一个步骤涉及将 RTF 文本字符串转换为纯文本,这最终导致用户对象在运行时发生内存泄漏。任务管理器将显示的列之一是“USER objects”——当它达到 ~10,000 时,程序将用尽分配空间并且程序出现“错误创建窗口句柄”错误
发生这种情况是因为我没有在方法结束时处理我的对象。
我的问题是,为什么 C#/.net 不为我处理它?
这是一个重现泄漏的快速代码示例。将代码放入 Winforms 应用程序并按下按钮以使其循环通过内存浪费。
private void wasteMemory()
{
System.Windows.Forms.RichTextBox rtfBox = new System.Windows.Forms.RichTextBox();
//RTF text that reads "Hello World"
rtfBox.Rtf = "{\\rtf1\\ansi\\ansicpg1252\\deff0\\deflang1033{\\fonttbl{\\f0\\fnil\\fcharset0 Arial;}} {\\colortbl ;\\red0\\green0\\blue0;} \\viewkind4\\uc1\\pard\\cf1\\fs29 Hello World} ";
//If line below is commented out, User Objects grow out of control.
//rtfBox.Dispose();
}
private void button1_Click(object sender, EventArgs e)
{
for (int i = 1; i < 100000; i++)
{
wasteMemory();
}
}
我的理解是,当方法完成时,方法的范围内创建的任何对象都会被处理掉。我希望 rtfBox 被处理掉,但事实并非如此。