C#object array = null,不释放内存

时间:2013-01-08 09:00:23

标签: c# memory

在我做的项目中是内存泄漏。我重写了所有修复一些功能,但还剩下一个:

程序有一个面板对象数组,每当我放入一个新面板时,它会增长。当它到达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:currentPanel = new Panel();
之后我调用这个函数:setCurrentPanelConfiguration:

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向下移动时,这样做。

2 个答案:

答案 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