Korrekte Methode zur Freigabe von Handles



  • Hallo!

    Ich beschäftige mich gerade etwas mit der Win-API Programmierung und habe eine Frage zur korrekten Freigabe von Handles. Ich habe bemerkt, dass einige Beispielprogramme "CloseHandle" verwenden und Andere den Handle einfach auf INVALID_HANDLE_VALUE setzen.

    Was ist nun die richtige Methode? Bleiben Memory Leaks, wenn man den Handle nur auf INVALID_HANDLE_VALUE setzt? Wird der Handle bei Verwendung von "CloseHandle" automatisch auf INVALID_HANDLE_VALUE gesetzt? Oder sollte man den Handle erst mit CloseHandle schliessen und dann noch auf INVALID_HANDLE_VALUE setzen?



  • afaik kümmert sich windows um deinen speicher

    msdn schrieb:

    CloseHandle invalidates the specified object handle, decrements the object's handle count, and performs object retention checks. After the last handle to an object is closed, the object is removed from the system.

    ich würd immer closehandle bevorzugen und danach nix mehr damit machen



  • ich hab meine handels noch nie geschlossen... was hat das jezt fuer auswirkungen auf meine programme??



  • Sofern du nich ständig neue Handles aufmachst wirst du wohl kaum was merken.
    Windows killed (fast) jegliche Handles nach dem Programmende von alleine...

    Wenn du aber z.B. alle paar meter GDI-Handles erzeugst und nicht wieder freigibst, wird es irgendwann anfangen grafikfehler zu hageln...



  • Anfänger_1 schrieb:

    Was ist nun die richtige Methode?

    Da solltest du dir die Funktion anschaun, mit welcher das Handle erstellt wurde. Normalerweise steht dort, ob das Handle explizit freigegeben werden muss (zB mittels CloseHandle) oder eben nicht. Die Sache einfach so im Sand verlaufen zu lassen, ist jedenfalls keine gute Idee. Früher oder später wirst du nämlich mit den Konsequenzen zu kämpfen haben, Fehler, Performanceverlust oder was auch immer. Generell solltest du Handles dann freigeben, wenn du sie nicht mehr brauchst. Praktisch genauso wie mit dynamischem Speicher.
    Das Handle auf INVALID_HANDLE_VALUE zu setzen, ist absolut witzlos. Erstmal gibt es Handles, für die NULL ebenso 'invalid' bedeutet. Ausserdem werden Handles "automatisch" ungültig. Entweder du nimmst sie selbst aus der Verantwortung oder rufst eben eine entsprechende Funktion auf. Je nach Szenario wie oben beschrieben. Sollte man das Handle trotzdem verwenden, dann ist das kein Programmfehler, sondern ein logischer Fehler.
    Warum setzen dann einige Leute das Handle trotzdem auf INVALID_HANDLE_VALUE? Im Grunde ist das nur für Debug Builds sinnvoll, um solche Logikfehler leichter zu finden und zu fixen. Denn ein INVALID_HANDLE_VALUE wird eine entsprechende Funktion mit Sicherheit fehlschlagen lassen. Bei einem unbestimmten Handle Wert hast du undefiniertes Verhalten.



  • Danke für die Antworten.


Anmelden zum Antworten