2016-07-13 11 views
1

Ich habe eine Windows Form-Anwendung. Wenn ich dem Formular dynamisch einige Schaltflächen hinzufüge und dann diese Schaltflächen lösche, entsteht ein Speicherleck.Dynamic steuert Speicherverlust

public partial class Form1 : Form 
{ 
    private Button[] buttons = new Button[1000]; 

    private void button1_Click(object sender, EventArgs e) 
    { 
     for (int i = 0; i < 1000; i++) 
     { 
      var b = new Button(); 
      Controls.Add(b); 
      buttons[i] = b; 
     } 

     for (int i = 0; i < 1000; i++) 
     { 
      Controls.Remove(buttons[i]); 
      buttons[i].Dispose(); 
      buttons[i] = null; 
     } 
    } 
} 

Speichernutzung:

  • Nach Formular geladen: 3720 KB
  • Nach button1 klicken:. 5144 KB

(Diese Zahlen eine vollständige Garbage nach der Durchführung Sammlung aufgezeichnet Programm wurde ohne Debugger, Release-Build ausgeführt.)

Noch seltsamer, Unabhängig davon, wie oft button1_Click ausgeführt wird, bleibt die Speicherbelegung bei etwa 5100 KB. Was mache ich falsch?

+4

Wenn der Speicher bei 5,1 mb bleibt, ist kein Speicherleck vorhanden. Ein Leck bedeutet typischerweise, dass es nicht an einem bestimmten Punkt anhält. – Mikanikal

+0

Aber warum stieg die Speicherbelegung nach dem Hinzufügen und Entfernen der Steuerelemente? Das ist ziemlich komisch für mich. – jetstream96

+1

Sie könnten versuchen, GC.Collect() 'zu callen. Versuchen Sie auch, einen _memory_ Profiler wie [ANTS Memory Profiler] (http://www.red-gate.com/products/dotnet-development/ants-memory-profiler) zu verwenden. –

Antwort

0

Dies ist kein Speicherleck. Vor allem, wenn Sie sich auf den Windows Task-Manager verlassen, ist das nicht richtig. Wenn Sie den tatsächlichen Speicher Ihrer App wirklich messen möchten, verwenden Sie einige Leistungsindikatoren. Oder vielleicht sogar so etwas wie dieses,

private Process currentProcess = System.Diagnostics.Process.GetCurrentProcess(); 
long totalBytesOfMemoryUsed = currentProcess.WorkingSet64; 

Zweitens, auch wenn die Objekte, die in dem Heap zugewiesen werden, wird durch den Garbage Collector gesammelt, nachdem sie angeordnet sind, bedeutet das nicht, wird die Anwendung lassen Sie die nicht zugeteilten Erinnerung. Dies geschieht nur, wenn das Betriebssystem den verdrahteten Speicher für andere Operationen anfordert. Die Quintessenz ist, das ist kein Speicherleck.