私が作ったプロジェクトでは、メモリリークが発生しました。一部を修正するためにすべての関数を書き直しましたが、まだ1つ残っていました。
プログラムには、新しいパネルを挿入するたびに大きくなるパネルのオブジェクト配列があります。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;
}
スクロールのバグを修正するために、currentPanelを配置するPanelHistoryPanelを使用します。
HistoryPanel.Controls.Add(currentPanel);
次に、ユーザー名、現在の時刻、アバターのすべてのコントロールを追加します。
パネルを保存するには、上記のようにスペースを作成した後、それを配列パネルに追加します。
panels[panels.Length-1] = currentPanel;
履歴に最新のものが表示されるため、配列を使用します。これを行うには、すべてのパネルを80ピクセル下にシフトする必要があります。