Problem mit realloc
-
Ich programmiere gerade einen Webserver. Der Header, der vom Client empfangen wird, soll in einen Buffer eingelesen werden. Hierzu will ich mit read nach und nach die Daten lesen und in ein dynamisches Array schreiben. Mein Code sieht wie folgt aus:
(*this).buffer = malloc(256); do { bytes = read( (*this).fd_client,(*this).buffer + (*this).buffer_size, 256); // Speicher reservieren if (((*this).buffer = (char*) realloc((*this).buffer, (*this).buffer_size + bytes)) == NULL) { printf("ERROR: realloc failed"); free((*this).buffer); } // buffer_size ändern (*this).buffer_size += bytes; } while(con_header_finished(this) != 1);
Der erste Durchlauf der while Schleife funktioniert, aber beim zweiten Durchlauf kommt folgender Fehler:
*** glibc detected *** ./webserver: realloc(): invalid next size: 0x08888008 **
Aus dem Fehler schließe ich mal, das ich einen Fehler bei realloc gemacht hab. Ich weiß aber nich was da falsch sein soll. Ich hoffe ihr könnt mir helfen.
-
Hallo,
poste doch mal deine Struktur this, damit erkennbar wird, welche Elemente sie hat :xmas2:
-
Sehe ich das richtig? Du liest ein paar Bytes in deinen Puffer ein, und nachdem du das getan hast, vergrößerst du den Puffer, so dass die Bytes reinpassen?
Kommt dir diese Reihenfolge nicht auch irgendwie komisch vor?
Warum benutzt du in C++ überhaupt malloc & Co., wenn es da doch so schöne Container gibt, damit eben genau solche Fehler nicht passieren?
Und was soll das Gehampel mit "(*this)."?
-
MFK schrieb:
Warum benutzt du in C++ überhaupt malloc & Co....
wie kommst du darauf, dass er C++ benutzt?
-
... if (((*this).buffer = (char*) realloc((*this).buffer, (*this).buffer_size + bytes)) == NULL) { printf("ERROR: realloc failed"); free((*this).buffer); } ...
austch! so macht es keinen Sinn, wenn realloc NULL zurücklieferst, hast du erstens der erste Pointer verloren und 2. machst du free(NULL) (früherer glibc haben da gemekert).
Außerdem: thou shalt not cast realloc
Und realloc ganz falsch benutzt. Btw, du kannst auch "this->" benutzen:
typeof(this->buffer) *tmp; this->buffer = malloc(256); if(this->buffer == NULL) <FEHLER BEHANDLUNG> do { bytes = read(this->fd_client, this->buffer + this->buffer_size, 256); // Speicher reservieren tmp = realloc(this->buffer, this->buffer_size + bytes); /* macht für mich keinen Sinn, am besten wäre + 256 */ if(tmp == NULL) { printf("ERROR: realloc failed"); free(this->buffer); <FEHLERBEHANDLUNG> <EXIT> } this->buffer = tmp; this->buffer_size += bytes; } while(con_header_finished(this) != 1);
edit:
c-freak schrieb:
MFK schrieb:
Warum benutzt du in C++ überhaupt malloc & Co....
wie kommst du darauf, dass er C++ benutzt?
weil der OP 'this' benutzt und auch realloc castet?
-
danke für eure hilfe, hatte einige denkfehler drinne, auf die ich einfach nich gekommen bin. ich muss c benutzen, sonst würd ichs ja nich so umständlich programmieren. habs jetzt wie folgt gelöst:
char* tmp; // solange Daten lesen, bis der Header vollständig empfangen wurde do { // Speicher reservieren if ( (tmp = realloc( this->buffer, this->buffer_size + 256 )) == NULL ) { printf("ERROR: realloc failed"); free(this->buffer); } else this->buffer = tmp; read( this->fd_client,this->buffer + this->buffer_size, 256 ); // buffer_size ändern this->buffer_size += 256; } while(con_header_finished(this) != 1);
-
ist aber immer noch falsch. Wenn realloc fehlschlägt, solltest du komplett aus der while schleife rausgehen (mit break z.b.), stattdessen bleibst du drin, read schreibt in einem Bereich, wo er nicht schreiben sollte und der nächste realloc-Aufruf wird sicherlich auch fehlschlagen.
-
stimmt, danke