2016-04-28 2 views
2

Nach der Verwendung von RemoveRange bleiben die Elemente im Speicher. Es gibt keinen anderen Hinweis, den ich auf diese Gegenstände weiß. Sollte ich nur einen Workaround verwenden, wo ich die gewünschten Artikel kopiere und die alte Liste komplett abbringe?C# Liste <T> RemoveRange Was passiert mit entfernten Objekten?

ein Beispiel zur Veranschaulichung gemacht:

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(); 
} 

Dank!

Antwort

4

Das Entfernen der letzten Referenz auf ein Objekt zerstört es nicht und gibt Speicher frei, stattdessen wird es irgendwann später ausgeführt, wenn der Garbage Collector ausgeführt wird.

Da Ihre Artikel jedoch zum Einmalgebrauch bestimmt sind (z. B. IDisposable), sollten Sie die Artikel Dispose() anrufen, die Sie entfernen, z. B. vor dem Entfernen aus der Liste. Dies führt dazu, dass die Instanzen nicht verwaltete Ressourcen deterministisch bereinigen, anstatt darauf zu warten, dass der GC und die Finalizer ausgeführt werden, und somit das Verhalten so aussieht, wie Sie es erwartet haben.

+0

Danke, das war's. Ich benutze normalerweise viel, habe aber aus irgendeinem Grund nicht daran gedacht. – george

Verwandte Themen