[C | VS] Memory leak mit realloc

cwriter

Erfahrenes Mitglied
Hallo Welt und einen schönen Heiligabend!

Ich wurde durch den Umgang mit realloc() erschüttert.
C:
int testfunction()
{
    char* all = (char*) malloc(64*sizeof(char));
    if(all == NULL) return -1;
    char* alltmp = (char*)realloc(all,100*sizeof(char));
    if(alltmp == NULL)
    {
        free(all);
        return -2;
    }
    all = alltmp;
    //Hier mit all arbeiten
    //hier habe ich all = NULL; eingefügt.
    char* alltmp2 = (char*)realloc(all,200*sizeof(char));
    if(alltmp2 == NULL)
    {
        free(all);
        return -3;
    }
    all = alltmp2;
    free(all);
    return 0;
}
funktioniert nicht und schmeisst die Meldung "Heap Corruption" raus, anstatt NULL zurückzugeben. Mehrere reallocs auf denselben Pointer in einer anderen Funktion funktionieren aber anstandslos.
Dann habe ich etwas mit free() gespielt. Das warf auch eine "Heap Corruption". Mit der Zeit hatte ich die Nerven verloren und einfach ein
C:
 all = NULL;
vor das zweite realloc gesetzt (meiner Meinung nach ein Memory Leak). Ich erwartete einen fluchenden Debugger, doch es lief. Und jetzt bin ich verwirrt: Selbst der Taskmanager zeigt keine übermässige Speichernutzung.

Vielleicht ist noch anzumerken, dass der Code im Debug-Mode auch ohne
C:
 all = NULL;
funktioniert hat, im Release-Mode der Debugger jedoch meckerte. (Windows 7 64bit)
Nun zu meiner Frage: Weshalb kann ich nicht mehrere reallocs auf einen Pointer ausführen, wenn ich den Pointer nicht auf NULL gesetzt habe (und damit den alten Speicher "verliere")?

Der konkrete Code ist im Anhang. Es geht um ein Programm, das die Fenstertitel ausliest und an einen Server schickt.

Liebe Grüsse, frohe Festtage und herzlichen Dank an alle, die den Text durchgelesen haben ;-)
cwriter

//EDIT: Scheint an strtok() zu liegen. Aber warum crasht realloc()? Weil strtok() den Pointer verändert?

Edit v. ComFreek: Unwichtige User-Options-Dateien im Anhang gelöscht & besser komprimiert hochgeladen!
Edit an ComFreek: Besten Dank!
Das Problem scheint tatsächlich an strtok() zu liegen, das den char* zerschiesst. Offensichtlich gibt es so auch kein Memory Leak.

Danke an alle, die sich das durchgelesen haben!
 

Anhänge

  • Programm.7z
    5,9 KB · Aufrufe: 4
Zuletzt bearbeitet:

Neue Beiträge

Zurück