Funky Bob
2008-12-01, 13:14:34
Hallo,
ich habe ein Problem mit der free-Funktion in C.
Meine Aufgabe ist es eine verkettete Liste zu erstellen. Das Programm läuft auch soweit, nur habe ich gerade mal testweise 100000 Elemente erstellt und diese wieder gelöscht.
Nur anders als erwartet nimmt der Speicherverbrauch nicht ab, sondern sogar zu!
Die Deklaration des Structs sieht so aus:
struct list{
int number;
struct list * ptr;};
char *end;
char *start;
Dann das einfügen passiert folgendermaßen:
//Weiteres Element hinten anhängen
void enqueue(int element)
{
//Neue Zeigerstrukturen erstellen und Speicher reservieren
struct list *newele;
struct list *helpele;
newele=malloc(sizeof(*newele));
helpele=malloc(sizeof(*helpele));
//Falls nur das Endelement existiert das erste Element erstellen
if(isempty()!=0)
{
newele->number=element;
newele->ptr=end;
start=newele;
}
//Ansonsten das vorletzte Element suchen, dessen Zeiger auf die neue Struktur legen
//und bei der neuen Struktur den Ptr aufs Endelement setzen.
else
{
newele->number=element;
newele->ptr=end;
helpele=start;
while(helpele->ptr!=end)
{
helpele=helpele->ptr;
}
helpele->ptr=newele;
}
}
Und dann das Ausgeben und Löschen des letzten Elementes:
//Löschen und Ausgabe des ersten Elementes
int dequeue()
{
//Falls Liste nicht leer
if(isempty()==0)
{
//Zeigerstructs erstellen, Speicher reservieren
struct list *oldele;
struct list *newstartele;
oldele=malloc(sizeof(*oldele));
newstartele=malloc(sizeof(*newstartele));
//Zu löschende Struktur auf den Startwert legen
oldele=start;
//Zukünftiges neues Element festlegen, start auf das neue Element legen
newstartele=oldele->ptr;
start = newstartele;
//Ausgabe
if(isempty()==0)
{
printf("Element mit Wert %d geloescht, neues erstes Element hat den Wert %d\n\n",oldele->number,newstartele->number);
}
else
{
printf("Letztes verbleibendes Element mit dem Wert %d geloescht!\n\n",oldele->number);
}
//Freigeben des Speicherplatzes
free(oldele);
}
else
{
printf("Keine Elemente zum loeschen vorhanden!\n\n");
}
}
Nun habe ich von verschiedenen Personen gehört, man müsse bei Strukturen erst die einzelnen Unterpunkte freigeben und dann zum Schluß das große Ganze. Dies führt aber zu Fehlermeldungen während des Löschens.
Wenn ich den Code so nutze, wie er oben steht kompiliert er zwar, aber das Freigeben des Speichers belegt komischerweise mehr Speicher als vorher?!
ich habe ein Problem mit der free-Funktion in C.
Meine Aufgabe ist es eine verkettete Liste zu erstellen. Das Programm läuft auch soweit, nur habe ich gerade mal testweise 100000 Elemente erstellt und diese wieder gelöscht.
Nur anders als erwartet nimmt der Speicherverbrauch nicht ab, sondern sogar zu!
Die Deklaration des Structs sieht so aus:
struct list{
int number;
struct list * ptr;};
char *end;
char *start;
Dann das einfügen passiert folgendermaßen:
//Weiteres Element hinten anhängen
void enqueue(int element)
{
//Neue Zeigerstrukturen erstellen und Speicher reservieren
struct list *newele;
struct list *helpele;
newele=malloc(sizeof(*newele));
helpele=malloc(sizeof(*helpele));
//Falls nur das Endelement existiert das erste Element erstellen
if(isempty()!=0)
{
newele->number=element;
newele->ptr=end;
start=newele;
}
//Ansonsten das vorletzte Element suchen, dessen Zeiger auf die neue Struktur legen
//und bei der neuen Struktur den Ptr aufs Endelement setzen.
else
{
newele->number=element;
newele->ptr=end;
helpele=start;
while(helpele->ptr!=end)
{
helpele=helpele->ptr;
}
helpele->ptr=newele;
}
}
Und dann das Ausgeben und Löschen des letzten Elementes:
//Löschen und Ausgabe des ersten Elementes
int dequeue()
{
//Falls Liste nicht leer
if(isempty()==0)
{
//Zeigerstructs erstellen, Speicher reservieren
struct list *oldele;
struct list *newstartele;
oldele=malloc(sizeof(*oldele));
newstartele=malloc(sizeof(*newstartele));
//Zu löschende Struktur auf den Startwert legen
oldele=start;
//Zukünftiges neues Element festlegen, start auf das neue Element legen
newstartele=oldele->ptr;
start = newstartele;
//Ausgabe
if(isempty()==0)
{
printf("Element mit Wert %d geloescht, neues erstes Element hat den Wert %d\n\n",oldele->number,newstartele->number);
}
else
{
printf("Letztes verbleibendes Element mit dem Wert %d geloescht!\n\n",oldele->number);
}
//Freigeben des Speicherplatzes
free(oldele);
}
else
{
printf("Keine Elemente zum loeschen vorhanden!\n\n");
}
}
Nun habe ich von verschiedenen Personen gehört, man müsse bei Strukturen erst die einzelnen Unterpunkte freigeben und dann zum Schluß das große Ganze. Dies führt aber zu Fehlermeldungen während des Löschens.
Wenn ich den Code so nutze, wie er oben steht kompiliert er zwar, aber das Freigeben des Speichers belegt komischerweise mehr Speicher als vorher?!