malloc(), free()
-
Hallo!
Ich lerne gerade für eine C-Klausur und bin bei dieser Vorlesungsfolie in meinen Unterlagen stutzig geworden:
Im folgenden Beispiel wird sichergestellt, dass nur ein erfolgreich angelegter Speicherblock freigegeben wird
double *vector = (double*) malloc(3*sizeof(double)); if(!vector) { free(vector); vector = 0; /* good practice: invalidate pointer */ }
Zu meiner Frage: ich dachte if() wird immer dann ausgefuehrt, wenn der Inhalt der Klammer wahr ist (also ungleich 0). Wenn der Speicher erfolgreich angelegt wurde sollte vector doch eigentlich ungleich 0 sein. Weiter dachte ich, dass !ungleich null == 0. Stimmt das soweit? Dann sollte if() ausgeführt werden, wenn der Speicher NICHT angelegt wurde und nicht wie im Erklärungstext steht, wenn der Speicher angelegt werden konnte.
hab ich was falsch verstanden was die Bedeutung von if(!0) if(1) und if(0) angeht? oder ist ein Fehler in meiner Folie?
-
Der Code ist voller worst-practices und ziemlicher Unsinn.
double *vector = (double*) malloc(3*sizeof(double));
double *vector = malloc(3* sizeof *vector);
if(!vector) { free(vector); vector = 0; /* good practice: invalidate pointer */ }
free(vector);
Der Fehler den du da gefunden zu haben meinst ist übrigens tatsächlich da.
-
wenn malloc fehlschlägt, bekommst du einen 0 Zeiger.
Und ein free auf einen 0 Zeiger ist kein Problem.Die Abfrage auf 0 macht aber dann Sinn, wenn du tatsächlich auf den Speicher zugreifst.
int *ptr=malloc(100*sizeof(int)); if(ptr) { // ...mach irgendwas mit dem Speicher... ptr[77]=12; // ...usw... } free(ptr);
-
SeppJ schrieb:
double *vector = (double*) malloc(3*sizeof(double));
double *vector = malloc(3* sizeof *vector);
Wieso is das denn eine "worst-practise", das hilft doch der Codekompatibilität mit C++!?
-
-
dot schrieb:
Wieso is das denn eine "worst-practise", das hilft doch der Codekompatibilität mit C++!?
Wieso sollte ich C-Code zu C+ kompatibel halten? Alles was ich mir dafür einbrocke sind mögliche Fehler.
-
melondolphin schrieb:
double *vector = (double*) malloc(3*sizeof(double)); if(!vector) <-- sollte wohl auch eher (vector) heißen { free(vector); vector = 0; /* good practice: invalidate pointer */ <-- Schrott, schrottige Praktik }
Viele Compiler produzieren Code, der abbricht, wenn man einen identischen Speicherbereich mehrfach mit free freigibt.
Durch deine Schrott-Praktik verhinderst du, dass das Programm dich auf diesen deinen Designfehler hinweist; du verschleierst also deinen Fehler, der Compiler, der im Gegensatz zu dir keine Fehler macht, hat keine Möglichkeit mehr, dich auf deine Fehler hinzuweisen.double *vector = malloc(3*sizeof*vector); if(vector) { macheirgendwasmit(vector); } free(vector);