possible Memleak?



  • 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.





  • 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 */
            ...
        }
    }
    


  • Ich verweise da mal am besten jetzt hier auf valgrind. Lass es mal damit durchlaufen, dein Programm. Wenn entsprechende Debugsymbole mit einkompilliert sind kann es dir sogar den Stacktrace samt Codezeile ausspucken wo der memleak passiert. Dann ist das meistens ein Ding von Minuten dass man das gefixed hat.

    Sollte auf den meisten Distributionen im Paketmanager erhältlich sein.



  • Also ich würde die Spezifikation zur Hand nehmen und genau lesen. Wenn Du einen Dateideskriptor mit der Systemfunktion open erzeugt hast, dann liefert es entweder dein Dateideskriptor oder im Fehlerfall die -1 zurück. Dass -1 kein gültiger Dateideskriptor ist, ist hier implizit enthalten. Ob -2 ein gültiger Dateideskriptor ist, ist nicht spezifziert. Daher solltest Du genau auf -1 abfragen, wenn Du wissen willst, ob Deine Variable einen gültigen Deskriptor hält.

    Daher gebe ich dem Tool recht, wenn er diese Empfehlung ausgibt.


Anmelden zum Antworten