2016-04-28 8 views
2

RemoveRangeを使用すると、アイテムがメモリ内に残っているように見えます。私がこれらの項目について知っている他の参照はありません。私はちょうど私が望むアイテムをコピーし、古いリストを完全に消去する回避策を使うべきですか?c#リスト<T> RemoveRange削除したアイテムはどうなりますか?

private void Form1_Load(object sender, EventArgs e) 
{ 
    bmp = new Bitmap(5000, 5000, PixelFormat.Format32bppPArgb); 
    pictureBox1.Image = bmp; 
    pictureBox1.Width = bmp.Width;pictureBox1.Height = bmp.Height; 
    bmp2 = new Bitmap(some_image_file);//500x500 bitmap 
} 
private void pictureBox1_MouseDown(object sender, MouseEventArgs e) 
{ 
    bitmap_list.Add(new Bitmap(bmp)); 
    Graphics.FromImage(bmp).DrawImage(bmp2, e.X - bmp2.Width/2, e.Y - bmp2.Height/2); 
    pictureBox1.Refresh(); 
} 
private void button1_Click(object sender, EventArgs e) 
{// where do the items go? memory is not freed until running a manual GC 
    bitmap_list.RemoveRange(1, bitmap_list.Count - 1); 
} 
private void button2_Click(object sender, EventArgs e) 
{// if this is not clicked, memory will run out even after clearing the list 
    // down to one item 
    GC.Collect(); 
} 

感謝を:

は説明するために例を作りましたよ!

答えて

4

オブジェクトへの最後の参照を削除しても、オブジェクトを破棄してメモリを解放するのではなく、ガベージコレクタが実行されるときに後で実行されます。

あなたの商品は使い捨て(例:IDisposableを実装している)なので、リストから削除する前に、削除するアイテムのDispose()に電話する必要があります。これにより、GCとファイナライザが実行されるのを待つのではなく、アンマネージリソースを確定的にクリーンアップして、期待どおりの動作をさせることができます。

+0

ありがとうございました。私は通常、多くを処分しますが、何らかの理由でここでそれを考えなかったのです。 – george

関連する問題