[C] Wenn kein free() erfolgt ...

plex84

Grünschnabel
Dieses Programm verdeutlicht meine Frage bestimmt besser als tausend Worte:

Code:
#include <stdio.h>
#include <stdlib.h>

int
allokieren(void)
{
        char *var;
        var = NULL;

        if ((var = malloc(50 * sizeof(char))) == NULL)
        {
                fprintf(stderr, "malloc() fehlgeschlagen!\n");
                return 1;
        }
        /* free(var) */
        return 0;
}

int
main(int argc, char *argv[])
{
        while (!allokieren());
        return 1;
}

Hat dieses Programm nun zur Folge, den gesamten Speicher zu nutzen, wodurch das System auf keinen Speicher mehr zugreifen kann? Oder kann ich das Programm durchaus so benutzen, da das free() unwichtig ist?

An dieser Stelle denke ich, dass free() in der Tat unwichtig ist, da die Variable "var" nur zu der Funktion "allok()" gehört und somit nach beenden der Funktion doch sowieso gelöscht wird.

Oder täusche ich mich da?
 
Es wird genau das machen was es soll Speicher anfordern... bis keiner mehr da ist!

Ich hab es nicht ausprobiert aber höchstwahrscheinlich wird es spätestens dann vom Betriebssystem raus geschmissen sonsonten kehrt malloc mit einer Fehlermeldung zurück das Programm wird beendet. Hierbei wird die exit() funktion aufgerufen und dabei der Speicher wieder frei gegeben.

free ist schon wichtig damit eben nicht der ganze Speicher dicht ist.
Gruß André
 
da die Variable "var" nur zu der Funktion "allok()" gehört und somit nach beenden der Funktion doch sowieso gelöscht wird.

Automatische Allokierung:

Code:
int
allokieren(void)
{
        char var = 's';
        return 0;
}

Für die Variable var wird automatische Speicher bereitgestellt (Realisierung
durch Stack). Nach verlassen der Funktion "allokieren" wird der Speicher für
var automatisch wieder freigegeben.

Manuelle Allokierung:

Code:
int
allokieren(void)
{
        char* var = malloc(50 * sizeof(char));
        /* free(var) */
        return 0;
}

var zeigt auf einen Speicherbereich der manuell mittels der Funktion malloc
angefordert wurde. (Dieser liegt auf dem Heap).
Nach dem Verlassen der Funktion "allokieren" ist der Speicher für den Zeiger var
zwar freigegeben wurden, aber der Speicherbereich auf den var einmal zeigte ist
noch immer belegt, wenn free() nicht aufgerufen wurde:
=> du bekommst ne Menge Garbage im Speicher. Der Speicher ist nicht mehr
verwendbar da dir die Referenz auf ihn verloren gegangen ist.

Gruß

RedWing
 
Das Problem läuft ne weile und das system kann auch mallangsamer werden wegen swapen aber das System wird nicht richtig "zerstört" da windows jedem Programm 4 GByte zugesteht wovon es jedoch nur 2 GByte allocieren kann ... wenn der heap voll ist kriegst du kein Speicher mehr und wenn das programm weg ist ist auch wieder alles wie es war. Solange der SPeicher nicht prozess übergreifgend reserviert wird passiert da net viel
 
Zurück