PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C: Speicher freigeben bei verketteten Listen


Gast
2007-05-25, 23:02:42
Ich habe eine kleine Frage zum Thema dynamische Speicherverwaltung. Inspiriert wurde das Ganze durch dieses Stück Code (http://www.galileocomputing.de/openbook/c_von_a_bis_z/c_026_010.htm#RxxobKap02601004002C781F03F1A9) (ganz unten), welches einen String mit Übergabeparametern (GET oder POST) in eine verkettete Liste umwandelt.

Ein Listenelement sieht dabei wie folgt aus:

struct CGI_DATEN {
char *variable;
char *wert;
struct CGI_DATEN *next;
};


An die beiden Pointer variable und wert werden dynamisch allokierte Strings angehängt.

Die Frage ist jetzt, ob ich bevor ich ein Listenelement löschen kann auch vorher die beiden Strings einzeln löschen muss oder ob es ausreicht, wenn ich das gesamte Element wieder freigebe.

Ich hoffe ich konnte meine Frage verständlich rüberbringen.

Danke schonmal für die Hilfe!

Neomi
2007-05-25, 23:30:45
An die beiden Pointer variable und wert werden dynamisch allokierte Strings angehängt.

Die Frage ist jetzt, ob ich bevor ich ein Listenelement löschen kann auch vorher die beiden Strings einzeln löschen muss oder ob es ausreicht, wenn ich das gesamte Element wieder freigebe.

Da die beiden Pointer auf extra allokierten Speicher verweisen und die Struktur keinen Destruktor hat, mit dem dieser Speicher wieder freigegeben wird, mußt du das beim Löschen der Listenelemente manuell erledigen. Ansonsten hast du ein Speicherleck.

Threadstarter
2007-05-25, 23:41:24
Danke schonmal für die Antwort!

Das habe ich auch vermutet, allerdings ist auf der nächsten Seite (http://www.galileocomputing.de/openbook/c_von_a_bis_z/c_026_011.htm#RxxobKap02601104002C791F030198) ein Beispiel, bei dem folgende Funktion zum Aufräumen verwendet wird:

void loeschen(struct CGI_DATEN *daten) {
struct CGI_DATEN *next = NULL;
while(daten != ende) {
next = daten->next;
if(daten->variable != NULL)
free(daten);
daten=next;
}
}


Diese gibt allerdings nur das Element frei, wenn ich das richtig interpretiere. Sehe ich das also richtig, dass damit nicht der ganze angeforderte Speicher wieder freigegeben wird?

Expandable
2007-05-26, 00:27:49
Danke schonmal für die Antwort!

Das habe ich auch vermutet, allerdings ist auf der nächsten Seite (http://www.galileocomputing.de/openbook/c_von_a_bis_z/c_026_011.htm#RxxobKap02601104002C791F030198) ein Beispiel, bei dem folgende Funktion zum Aufräumen verwendet wird:

void loeschen(struct CGI_DATEN *daten) {
struct CGI_DATEN *next = NULL;
while(daten != ende) {
next = daten->next;
if(daten->variable != NULL)
free(daten);
daten=next;
}
}


Diese gibt allerdings nur das Element frei, wenn ich das richtig interpretiere. Sehe ich das also richtig, dass damit nicht der ganze angeforderte Speicher wieder freigegeben wird?

Ja das scheint falsch zu sein. Deswegen: Wenn's nicht unbedingt reines C sein muss, C++ und std::string verwenden (und am besten gleich noch std::list mit dazu ;) )!

Threadstarter
2007-05-26, 09:35:00
Danke auch dir!

Damit sehe ich meinen Verdacht bestätigt und kanns jetzt richtig machen :) . Das mit C++ ist sowieso eine gute Idee.

Das Thema ist denke ich dann damit erledigt.

Gast
2007-05-26, 12:30:24
Leute entweder NUR C oder NUR C++ lernen. Das ist nichts zum Mischen. Später umsteigen ja, aber als Anfänger erst mal eins lernen!!

wori
2007-05-27, 12:38:34
Die Speicherverwaltung macht bei C der Programmierer und zwar für alles!

HellHorse
2007-05-27, 17:22:55
Die Speicherverwaltung macht bei C der Programmierer und zwar für alles!
Ausser dem Stack natürlich.