malloc / free Frage ... mal wieder ^^
-
Hallo,
ich habe ne Frage zu malloc / free und obwohl ich schon auch das Forum durchsucht habe, bin ich nicht fündig geworden. Am besten ich poste mal das Codestückchen und kommetiere mein Gedanken dazu mit '///'. Das Programm/Funktion läuft so dass es am 1. free (nicht einkommentiert) ankommt, bzw. fehlschlägt.
int check_webserver_user (void) { struct passwd *pw; /// hier hole ich mir den Speicher für den struct pw = (struct passwd *) malloc (sizeof (struct passwd)); /// und prüfe obs geklappt hat if (pw == 0) { error_html ("malloc failed. Aborting"); exit (EXIT_FAILURE); } /// Speicherbereich mit 0 füllen memset (pw, 0, sizeof (struct passwd)); /// das struct mit Daten füllen pw = getpwnam (webserver_user); /// und prüfe obs geklappt hat if (pw == 0) { return -1; } /// die if Abfrage gibt true zurück also ... if (pw->pw_uid != getuid ()) { /// hier rein und zurück free (pw); return 1; } // free (pw); return 0; }
So, wenn ich das Programm nun ausführe bekomme ich immer
*** glibc detected *** ./secwrap: free(): invalid pointer
bei dem new. Wenn ich das new dann einkommentiere, dann passierts natürlich nicht. Beim zweiten new habe ich daselbe Problem.Allerdings kann ich das nicht nachvollziehen. Der Speicher wird ordentlich allokiert und benutzt und beim free passiert dann das ...
Kann mir das jmd. bitte erklären?
danke
Alex
-
acwn schrieb:
/// das struct mit Daten füllen
pw = getpwnam (webserver_user);An dieser Stelle passen Code und Kommentar nicht zusammen. Hier wird keine Struct gefüllt, hier wird ein Zeiger umgebogen. pw zeigt danach auf den Rückgabewert von getpwnam, und damit nicht mehr auf den Speicher, den du vorher mit malloc geholt hast.
-
Lasse den ganzen malloc Kram weg, bei free musst du mal die Spezifikation von getpwnam anschauen, ob free möglich/nötig ist.
int check_webserver_user (void) { struct passwd *pw; pw = getpwnam (webserver_user); /// und prüfe obs geklappt hat if (pw == 0) { return -1; } if (pw->pw_uid != getuid ()) { /* free (pw);*/ return 1; } /* free (pw);*/ return 0; }
-
Danke für die fixen Antworten von euch beiden ^^
In den Spezifikationen von getpwnam steht nicht explizit dass man mit malloc/free arbeiten muss. Ich dachte bisher, dass gehört zum guten Stil
Ich habe den malloc Kram nun mal weggelassen, nun motzt valgrind auch nicht mehr
-
malloc / free in Verbindung macht für mich nur wirklich Sinn, wenn ich
vorher nicht weiß, wieviel Speicher ich brauche. Ich benutze doch auch
im High-Level-Assembler auf der Z/OS nur dann getmain, freemain, wenn ich
was dynamisch mache. Ich habe bisher in den seltensten Fällen wirklich
malloc - free benötigt - gut bei einigen Dingen gehts nicht anders - aber im
Regelfall weiß man doch, bez kann in der Anwendung begrenzen, wieviel Speicher gebraucht wird - man muß doch nicht immer alles in einem Rutsch einlesen und oder
ausgeben. Aus der Großrechnerwelt kenne ich - und nutze ich auch mit C die Möglichkeiten der satzweisen Verarbeitung - hier ist halt der Datensatz nicht vordefiniert - sondern wird im Regelfall per lf oder cr-lf bestimmt.
Ganz abgesehen davon, wenn ich malloc nicht nutze, kanns auch nicht passieren, dass ein free vergessen geht und die Kiste zugemüllt wird.