Frage bezüglich Scope (Frage zur Umsetzung in SFML)



  • Hallo,

    ich habe gerade aus Interesse SFML studiert und bin dabei in der Datei SocketHelper.cpp auf folgendes Konstrukt gestoßen:

    00084 struct SocketInitializer
    00085 {
    00086     SocketInitializer()
    00087     {
    00088         WSADATA InitData;
    00089         WSAStartup(MAKEWORD(2,2), &InitData);
    00090     }
    00091 
    00092     ~SocketInitializer()
    00093     {
    00094         WSACleanup();
    00095     }
    00096 };
    00097 
    00098 SocketInitializer GlobalInitializer;
    

    Quelle: http://www.sfml-dev.org/documentation/1.5/SocketHelper_8cpp-source.htm

    Ich habe selber schon mit Sockets gearbeitet und mir ist der Sinn absolut klar.

    Mir stellt sich dabei nur die Frage: Wie lange ist das dort angelegte Objekt gültig? Und vorallem: Ab wann?

    Ist es nicht so, dass jede Source-Datei eine Art "eigenen Gültigkeitsbereich" hat und so weiter? Ist der hier beschriebene Code also sicher, dass das Objekt nicht mehrfach erstellt wird, etc.

    Würde mich über Klärung freuen. Danke 🙂



  • Die Variable GlobalInitializer ist spätestens, wenn du in die main kommst initialisiert und wird zerstört, wenn du die main wieder verlässt. Ist also global gültig. Das Problem ist aber, wenn du bereits vorher (z.B in einem Konstruktor eines anderen globalen Variable) darauf zugreifst, denn die Reihenfolge ist nicht geregetl, in denen globale Variablen über verschiedene Übersetzungseinheiten initialisiert werden. Die Zerstört ist in der umgekehrten Reihenfolge, wie sie initialisiert wurden, aber das hilft dir nicht viel, denn du weisst ja nicht, in welcher Reihenfolge die Initialisierung statt gefunden hat. 😉

    Mehfrach erstellt wird es nicht nein. Aber man könnte theoretisch selbst eine Variable vom Typ SocketInitializer erstellen und dann hast du das ganze 2x ja. Da sehe ich auch einen der Vorteile von Singletons gegenüber von globalen Variablen (ob Singletons gut oder böse sind sei dahingestellt), denn dort kannst du die Einmaligkeit steuern und ebenfalls, dass zum Zeitpunkt der Benuzung des Objektes eine Instanz da ist. (siehe Meyers Singleton).


Anmelden zum Antworten