在我做的项目中是内存泄漏。我重写了所有修复一些功能,但还剩下一个:
程序有一个面板对象数组,每当我放入一个新面板时,它会增长。当它到达400个面板时,它会删除最旧的面板以释放一些内存。
我不明白以下几点:
tempPanels = new Panel[panels.Length];
Array.Copy(panels, 1, tempPanels, 0, panels.Length - 1);//delete the oldest history log (the first of the array)
panels = null; //empty object array
panels = new Panel[tempPanels.Length + 1]; //set new length
tempPanels.CopyTo(panels, 0);//restore panels
当我使用上面的代码时,内存使用量仍在不断增加......有人可以解释一下为什么在将面板设置为null之前我必须首先处理面板吗?
tempPanels = new Panel[panels.Length];
Array.Copy(panels, 1, tempPanels, 0, panels.Length - 1);//delete the oldest history log (the first of the array)
panels[0].Dispose();
panels = null; //empty object array
panels = new Panel[tempPanels.Length + 1]; //set new length
tempPanels.CopyTo(panels, 0);//restore panels
提前致谢!
编辑@史蒂夫B:panel currentPanel;
currentPanel = new Panel();
public void setCurrentPanel()
{
currentPanel.Name = "panel" + panels.Length;
currentPanel.Size = new System.Drawing.Size(485, 75);
currentPanel.BackColor = Color.Transparent;
}
要修复滚动错误,我使用Panel HistoryPanel放置currentPanel:
HistoryPanel.Controls.Add(currentPanel);
然后我添加所有控件:用户名,当前时间和头像。
要保存面板,我在创建空格后将其添加到阵列面板,如上所示:
panels[panels.Length-1] = currentPanel;
我使用数组,因为历史记录显示最新的数组。每次我必须将所有面板80px向下移动时,这样做。
答案 0 :(得分:11)
因为将某些内容设置为null
并未处理它,它只是取消引用它 - 垃圾收集器不会监视您的分配以检查您的null
引用,它会在需要时执行(所有其他条件相同)或明确告知这样做。
简而言之,因为null
和内存管理是不同的事情。
答案 1 :(得分:3)
除了格兰特托马斯所说的,为什么不使用更容易管理的List<Panel>
?
代码将如下所示(假设panels
被声明为List<Panel>
):
Panel p = panels[0];
panels.RemoveAt(0); // This removes the first element
p.Dispose(); // This disposes of the element
如果您想保留代码,请阅读如下:
tempPanels = new Panel[panels.Length];
Array.Copy(panels, 1, tempPanels, 0, panels.Length - 1);//delete the oldest history log (the first of the array)
// Dispose of every element in the array
for (int i = 0; i < panels.Length; i++)
panels[i].Dispose();
// The following line is unneccessary, as the variable is re-assigned anyway
// panels = null; //empty object array
panels = new Panel[tempPanels.Length + 1]; //set new length
tempPanels.CopyTo(panels, 0);//restore panels