003
24.07.2003, 13:53 Uhr
ao
(Operator)
|
C++: |
LISTE *CreateListEntry(LISTE *Daten) { if(Daten == NULL) { Daten = (struct LISTE*)malloc(sizeof(struct LISTE)); FillData(Daten,0,LIST_TYPE_CASETTE); Daten->next = NULL; } else { while(Daten->next != NULL) Daten=Daten->next;
Daten->next = (struct LISTE*)malloc(sizeof(struct LISTE));
/* ##################################### */ Daten = Daten->next; /* DER KNACKPUNKT IST HIER!!!!!!! */ /* ##################################### */
FillData(Daten->next,0,LIST_TYPE_CASETTE); Daten->next = NULL; }
return Daten; }
|
Du bist vorher bis zum Ende der Liste gerannt und hast ein neues Element hintendrangehängt. Dann sagst du
C++: |
Daten = Dieses neue Element; /* paar andere Sachen */ return Daten;
|
d.h. du gibst nur das neue Element zurück. Der Anfang der Liste (vom ersten bis zum vorletzten) ist verloren -> Speicherleck.
Abhilfe: Wenn LISTE * Daten die gesamte Liste enthält, darfst du diesen Zeiger nicht modifizieren, sondern du brauchst in CreateListEntry einen Laufzeiger:
C++: |
LISTE *CreateListEntry(LISTE *Daten) { LISTE * Lauf = Daten; /* ab hier nur mit Lauf hantieren und Daten nicht mehr anfassen */ /* am Ende: */ return Daten; }
|
Nochn Tipp: Ich hab das so verstanden, daß der Zeiger Daten für die Funktion CreateListEntry unveränderlich sein soll. Wenn das zutrifft, kannst du das mit dem const-Qualifier kennzeichnen. Du schützt dich damit vor eigenen Programmierfehlern. Der Compiler wird dich mit einer Warnung oder einem Fehler darauf hinweisen, wenn du innerhalb der Funktion das const-Attribut verletzt, indem du den Zeiger manipulierst:
C++: |
LISTE *CreateListEntry(LISTE * const Daten) /* der Zeiger ist konstant, aber nicht das, worauf er zeigt */
|
|