2014-03-13 14 views
6

Ich wollte Speicherleck in meiner Anwendung simulieren. Ich schreibe folgenden Code und versuchte in Perfmon zu sehen.Warum verursacht dieser Code keinen Speicherverlust?

int main() 
{ 
    int *i; 
    while(1) 
    { 

     i = (int *) malloc(1000); 

     //just to avoid lazy allocation 
     *i = 100; 

     if(i == NULL) 
     { 
      printf("Memory Not Allocated\n"); 
     } 

     Sleep(1000); 
    } 
} 

Wenn ich sehe, gebrauchten Speicher im Task-Manager, ist es schwanken zwischen 52K und 136K, aber nicht darüber hinaus gehen. Bedeutet, irgendwas zeigt es 52K und manchmal 136K, ich verstehe nicht, wie dieser Code einmal zu 136K geht, zu 52K zurückkommt und nicht darüber hinausgeht.

Ich versuchte perfmon, aber nicht in der Lage, genau zu verwenden, was in perfmon, Snapshot des Zählers, um zu sehen, enter image description here

Bitte vorschlagen, wie Speicherverlust zu simulieren und wie es zu erkennen.

+0

Setzen Sie ein Häkchen, wenn Sie Speicher zuweisen, um zu sehen, ob er tatsächlich zugewiesen wird. – brokenfoot

+0

@brokenfoot Mein Code wurde aktualisiert. –

+2

Sie reservieren nur 100 Bytes pro 10 Sekunden. Es dauert mehr als 6 Minuten, um eine vollständige 4k-Seite zuzuordnen. Verwenden Sie größere Zahlen. – aragaer

Antwort

3

Ausschließlich ein kontextabhängiger Speicherverlust ist ein bisschen kontextabhängig: etwas in Ihrem Programm reserviert Speicher im Laufe der Zeit und befreit ihn nicht, , wenn es hätte freigegeben werden sollen.

Ihr Code erzeugt bei jedem folgenden Durchlauf durch die while-Schleife ein "Leck", weil Ihr Programm an diesem Punkt das Wissen über einen zuvor zugewiesenen Zeiger verliert. Dies ist jedoch nur bei Inspektion in diesem Fall sichtbar; Aus dem Quelltext sieht es eher so aus, als ob Sie tatsächlich, wenn auch sehr langsam, versuchen, eine Gedächtnisstresssituation zu schaffen.

zu ‚finden‘ ein Leck ohne Inspektion Sie benötigen ein Werkzeug, wie valgrind (Unix/Linux/OSX) oder in Visual Studio ermöglichen allocation tracing mit dem DEBUG_NEW Makro und sehen Sie die Ausgabe mit einem Debugger auszuführen.

Wenn Sie wirklich Speicher in Eile betonen wollen, zuteilen 1024 x 1024 x 1024 Byte zu einer Zeit ...

+0

Mein Programm läuft bereits in der Produktion. Ich wollte bestätigen, wenn es Speicherleck zeigt, weil es ein Leistungsproblem gibt. –

10

Während ein O tatsächliche Zuteilung von dynamisch zugewiesenen Speicher aufschieben, bis sie verwendet wird, Der Compiler-Optimierer kann Zuordnungen eliminieren, die nur in geschrieben werden und niemals gelesen werden. Da Ihre Schreibvorgänge kein gut definiertes beobachtbares Verhalten haben (Sie lesen nie davon), kann der Compiler sie möglicherweise optimieren. Ich würde vorschlagen, den generierten Assemblercode zu prüfen, um zu sehen, was der Compiler tatsächlich erzeugt. Wirklich, dies sollte einer der ersten Schritte bei der Beantwortung von Fragen wie "Warum benimmt sich dieser Code nicht so, wie ich denke, sollte es?".

+0

+1. Wirklich nette Erklärung.Fazit ist, dass es in der nicht-realen Welt möglicherweise nicht so leicht reproduzierbar ist, wie es scheint. –

Verwandte Themen