2016-05-13 13 views
0

Ich bin ziemlich neu in C. Ich lerne derzeit über Speicherverluste, und ich versuche, eine mit einem einfachen C-Programm zu erstellen. Ich sollte das laufen lassen, bis es abstürzt, aber wenn ich es benutze, erreicht der verwendete Speicher einen Spitzenwert von ungefähr 95%. Ist mein Code kein Speicherleck? Ist es mit Paging möglich? Hier ist der Code, den ich versuche:Absichtlich abstürzen C-Anwendung mit Speicherverlust

int main(void) { 
    while (1) 
    { 
     char *newArea = malloc(10); 
     char *mainArea = malloc(10000); 
     mainArea = newArea; 
    } 
} 
+2

versuchen, in den Raum zu schreiben –

+1

Ihr Code ist undicht Speicher, aber kann nicht abstürzen, weil Sie nicht den mallocated Speicher verwenden. – LPs

+1

Sie sollten den Rückgabewert Ihres malloc überprüfen. Wenn Sie 0 erhalten, konnte der Speicher nicht zugeordnet werden. – TheGreatContini

Antwort

4

Um Programme schneller zu machen und weniger Speicherbedarf viele OS zuweisen keine dynamischen Speicher vor dem Punkt, an dem es tatsächlich nutzen. Ihr Code verwendet niemals den dynamischen Speicher, daher weist das Betriebssystem wahrscheinlich nichts zu, es reserviert nur diesen Speicher.

Wenn Sie also versuchen, irgendwo in den zugewiesenen Speicher zu schreiben, sollten Sie wie erwartet zu wenig Speicher haben, da Sie das Betriebssystem zwingen werden, die tatsächliche Zuweisung durchzuführen.

+0

Also was wäre eine Möglichkeit, dass ich den mallocated Speicher verwenden könnte, um die Anwendung zum Absturz zu bringen? – Greg

+1

Darüber hinaus wird das Schreiben in den "allozierten" Speicher zum Absturz bringen, wenn die Zuteilungsanforderung zum ersten Mal nicht erfüllt werden kann und "NULL" zurückgegeben wird. Die Dereferenzierung verursacht einen Segmentierungsfehler ... –

-1

Was Sie tun, ist nur den verfügbaren Speicher erschöpft, und Sie können das einfacher machen - nur Speicher reservieren und vergessen:

int main(void) 
{ 
    while (1) 
    { 
     (void) malloc(10000); 
    } 
    return 0; // will never get here! 
} 

Speicherleck, aber ist etwas anderes - es ist die Zuteilung der Speicher für einige Aufgabe und nicht danach zu entsorgen. Zum Beispiel:

int main(void) 
{ 
    while (StillSomethingToDo()) 
    { 
     char *membuffer = malloc(10000); 

     DoSomethingWithTheBuffer(membuffer); 

     // forget to free(membuffer) 
    } 
    return 0; // will return normally 
} 

Nach der Schleife endet, wenn StillSomethingToDo() Returns ‚falsch‘ die main() schreitet zu return jedoch gibt es einige Blöcke auf dem Heap (viele von ihnen, möglicherweise) sind, die nicht free -d waren. Und sie können nicht mehr freigegeben werden, weil die Zeiger auf sie (alle vorherigen Werte von membuffer Variable) verloren sind.

+0

Aber der Moment, in dem der Prozess endet Der zugewiesene Speicher (verwendet oder nicht) wird freigegeben. –

+0

@mcleod_ideafix Natürlich! Der gesamte vom System dem Prozess zugewiesene Speicher wird beim Beenden des Prozesses an das System zurückgegeben. Einige Prozesse sind jedoch so konzipiert, dass sie lange arbeiten oder gar nicht beendet werden, bis das System ausfällt - zum Beispiel Systemdienste. Und dies ist der Fall, in dem Speicherlecks die meisten Probleme verursachen, weil 1) Systemressourcen verschwendet werden und 2) das vergessene Speichervolumen schließlich die pro Prozessschwelle des Systems erreicht, wodurch der Prozess zu früh beendet wird. – CiaPan