004
30.10.2016, 22:03 Uhr
ao
(Operator)
|
Im Fall von realloc ist auch die Überlegung wichtig, was mit dem alten Speicherinhalt passieren soll bzw. muss, falls die Vergrößerung fehlschlägt.
Bei deiner Implementierung (string = realloc (...)) zeigt string in diesem Fall auf NULL, und der alte Inhalt ist unwiederbringlich verloren (je nach Applikation würdest du ihn in dem Fall noch brauchen, um Schadensbegrenzung zu betreiben!) und der Speicher kann noch nicht mal mehr gefree't werden, weil du keinen Pointer mehr darauf hast. Du hast also zusätzlich zum fehlgeschlagenen alloc noch ein Speicherleck, was deine ohnehin schon prekäre Speichersituation weiter verschlimmern dürfte.
Der Test auf NULL ist also in diesem Fall KEINE reine Formsache.
Richtig ist, realloc folgendermaßen zu benutzen:
C++: |
int func (char ** newString, char * oldString, int newSize) { *newString = realloc (oldString, newSize); return (*newString != 0); }
|
Nur wenn *newString = realloc(...) erfolgreich verläuft, darfst du oldstring anschließend vergessen. Wenn realloc fehlschlägt, musst du dich selbst um die weitere Verwaltung von oldString kümmern. Dieser Post wurde am 30.10.2016 um 22:05 Uhr von ao editiert. |