possible Memleak?
-
Ist es eigentlich relevant ob man
if (fd > -1) close(fd);
oder
if (fd != -1) close(fd);
verwendet? Jedenfalls habe ich mal ein Checktool das mal testen lassen, welches die obere Version anmeckert.
-
Was ist "close" für eine Funktion?
-
Was ist fd?
-
Dachte das wäre ersichtlich, ok. Annahme wäre, dass man mit open eine Datei aufgemacht hat und close() soll das wieder zumachen.
Edit: oder auch ioctl() - dann close()
-
Tja, welches Tool meckert und was sagt es. ...Und ueberhaupt: Was hat das mit Speicher zu tun? Des weiteren sind die 0, 1 und 2 fuer Standardeingabe, -ausgabe und -fehler reserviert. Warum will man diese schliessen wollen?
-
Ich kenne weder open noch close. Ich kenn nur fopen, fclose und die Memberfunktionen der Streamklassen. Was meinst du nun?
-
Sorry, war etwas ungeschickt allgemein beschrieben, ich meine schon fopen usw. dann sind das wohl resource leaks. Das Tool heißt Cppcheck und sagt auch sinngemäß "possible resource leak".
-
Wozu überhaupt die Abfrage?
-
Kann ein File descriptor überhaupt negativ sein? Falls das ein unsigned Typ ist, wäre die erste Bedingung nämlich immer false.
-
dixidix schrieb:
Sorry, war etwas ungeschickt allgemein beschrieben, ich meine schon fopen usw.
Sicher? fopen gibt einen Zeiger zurück. Zeiger kann man nicht mit int vergleichen.
-
Er meint wohl diese linux-spezifischen Funktionen:
http://opengroup.org/onlinepubs/007908799/xsh/open.html
http://opengroup.org/onlinepubs/007908799/xsh/close.html
-
Da es sich hier um Zeiger handelt, ist wohl eine 0 im Fehlerfall anzunehmen. Bin wohl etwas durcheiandergekommen. D.h. ein Fehler kann bei der impliziten Typumwandlung eintreten. Entweder wird -1 in einen unsigned int konvertiert und dann ist die Zahl sehr gross, oder FILE* wird nach int konvertiert, dann ist der Wert immer groesser als -1. Dies gilt jetzt aber nur fuer fopen und fclose, diese Funktionen wuerde ich auch den andern vorziehen. fclose sollte auch bei einem 0 Zeiger funktionieren, so dass keine if-Abfrage noetig sein sollte.
-
!= -1
denn open liefert -1 im Fehlerfall.
Und warum hier soviel getrollt wird würde mich auch mal interessieren. Ist ne wahnsinnig simple Frage...
-
Shade Of Mine schrieb:
!= -1
denn open liefert -1 im Fehlerfall.
Und warum hier soviel getrollt wird würde mich auch mal interessieren. Ist ne wahnsinnig simple Frage...
Laut OP geht es aber doch um fopen und nicht um open (was nicht einmal Teil vom C++-Standard ist). Wo siehst du da Getrolle? Entweder ist deine Antwort falsch oder seine Frage ist es.
-
Wie gesagt, meine Frage war möglicherweise etwas unpräzise. Mir ging es wirklich nur darum, ob das Tool zurecht meckert, wenn man > -1 schreibt statt != -1.
Sehe ich das jetzt also richtig, dass man ohne ein if(...) auch auskommt und falls nicht, != -1 besser ist als > -1?Edit: es geht um Linux
-
Ok .. nimm != -1.
-
Shade Of Mine schrieb:
Ist ne wahnsinnig simple Frage...
Erst wenn man die 3 nachgeschobenen Erklärungen gelesen hat oder auf den ersten Blick erkannt hat dass hier linux-spezifische Themen im Standard-C++ Forum angesprochen wurden und fd für "file descriptor" steht.
Aber der OP scheint ja erkannt zu haben dass man zukünftig besser gleich alle relevanten Infos gibt.
-
Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ in das Forum Linux/Unix verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
knivil schrieb:
fclose sollte auch bei einem 0 Zeiger funktionieren, so dass keine if-Abfrage noetig sein sollte.
Tut es nicht. fclose(0) verreckt gnadenlos.
-
dixidix schrieb:
Ist es eigentlich relevant ob man
if (fd > -1) close(fd);
oder
if (fd != -1) close(fd);
verwendet? Jedenfalls habe ich mal ein Checktool das mal testen lassen, welches die obere Version anmeckert.
Nur aus reiner Neugier, welches Checktool verwendest du?
Zusätzlich müsste dein Checktool auch die Tatsache anmekern, dass du den Rückgabewert von close nicht abfragst.
Richtig wäre:if (-1 != fd) { if (-1 == close(fd)) { /* Fehler beim Schließen */ ... } }