Schließen von handles in Funktionen



  • Ich gehe von einem solchen (Pseudo-)Code aus:

    [code="cpp"]
    void myFunction()
    {
    HANDLE myHandle;

    OpenHandle(myHandle);

    while (1)
    {
    // mache etwas wofür myHandle benötigt wird
    }

    CloseHandle(myHandle);
    }

    1. Was geschieht, wenn das Programm plötzlich geschlossen wird und währenddessen die Funktion aufgerufen ist in der while()-Schhleife? Kommt es zu einem Aufruf von CloseHandle(), oder erledigt das Betriebssystem das automatisch mit Programmende und schließt das Handle?

    2. Macht es überhaupt einen Sinn nach der while-Schleife das CloseHandle() zu platzieren? Ich meine, dieser Code wird sowieso nie ausgeführt.



  • void myFunction()
    {
       HANDLE myHandle;
    
       OpenHandle(myHandle);
    
       while (1)
       {
          // mache etwas wofür myHandle benötigt wird
       }
    
       CloseHandle(myHandle);
    }
    


  • Vielleicht gibt es ja in dem "while" ein "break"?

    Auch schließt das OS (i.d.R.) alle Resourcen, wenn Du ein Prozess beendest.



  • In dem while gibt es in diesem Fall kein break, die Schleife kann nicht verlassen werden. Dann kann man also den CloseHandle()-Aufruf am Ende einfach weglassen, oder?



  • kmsdgsdgo schrieb:

    In dem while gibt es in diesem Fall kein break, die Schleife kann nicht verlassen werden. Dann kann man also den CloseHandle()-Aufruf am Ende einfach weglassen, oder?

    Nein, eben nicht. Nur weil das OS das evtl. auch selbst macht, musst du trotzdem immer zusehen, dass alle Daten, wenn sie nicht mehr verwendet werden, wieder freigegeben werden. Das ist mit Handles so und das ist auch mit allokiertem Speicher so. Wird ein Handle geschlossen, dann wird bestimmter Speicherbereich wieder freigegeben. Du musst eben selbst zusehen, wo du deine Handles schließt. Wenn dein Prozess aber einfach rabiat terminiert wird, dann ist das eben nicht zu änder. Des Weiteren muss ein Programm immer so ausgelegt werden, dass es terminieren kann, auch wenn es u.U. nur in bestimmten Situationen terminieren soll.



  • Natürlich kann man toten Code weglassen ohne dass was schlimmes passiert. Ist ja toter Code.
    Man sollte sich eher überlegen, wie denn das Programm überhaupt beendet wird, es soll ja nicht bis in alle Ewigkeit laufen, und dann beantwortet sich auch die Frage wo das CloseHandle hin muss.
    Eine andere Möglichkeit ist das Ding in ein C++-Objekt zu stecken.

    class Handle{
    public:
    	HANDLE myHandle;
    	Handle(){
    		OpenHandle(myHandle);
    	}
    	~Handle(){
    		CloseHandle(myHandle);
    	}
    private:
    	Handle(const Handle &h); //Handles sollen nicht kopiert werden
    };
    

    Dann benutzt man statt HANDLE ein Handle, was so ähnlich funktioniert, aber automatisch bei einem return, exit(), Verlassen des Scopes oder Sonstigem das HANDLE wieder frei gibt. Und man braucht sich nicht drum kümmern.


Anmelden zum Antworten