LebensZeit von "static"-Objekt in Funktion?



  • Hallo!
    Ich habe eine Frage zu einem "C++-Quiz" aus einer App . Folgendes Beispiel:

    #include <iostream>
    
    class A{
      public:
        A(){ std::cout << "a"; }
        ~A(){ std::cout << "A"; }
    };
    
    class B{
      public:
        B(){ std::cout << "b"; }
        ~B(){ std::cout << "B"; }
    };
    
    class C{ 
      public:
        C(){ std::cout << "c"; }
        ~C(){ std::cout << "C"; }
    };
    
    A a;
    
    void foo(){ static C c; }
    
    
    int main() {
    	
      B b;
      foo();
    	
      return 0;
    }
    

    hat die Ausgabe "abcBCA".
    Jetzt möchte ich gern verstehen warum, der Destruktor von "B" zuerst, also noch vor "C" aufgerufen wird?!
    Kann es möglich sein, das "C" länger lebt, weil ein statisches Objekt auch über die Funktion
    foo(); hinaus existiert, also nicht gleich mit/nach Beendigung der Funktion zerstört wird?

    Würde mich über Antwort freuen.
    Danke im voraus und grüße



  • @tryn4x Wie hast du denn die Beschreibung zu static (innerhalb von Funktionen) verstanden?


  • Mod

    Das kann nicht bloß so sein, dass c länger lebt als der Funktionsaufruf, das ist sogar die Bedeutung von static schlechthin. Was hattest du sonst erwartet? Guck dir auch mal an, was passiert, wenn du foo() mehrmals nacheinander aufrufst, jeweils mit und ohne static.



  • @DirkB
    Hallo
    Danke für deine schnelle Antwort.
    Wenn ich jetzt schreibe, das eine variable mit "static" nur einmal angelegt wird und der Wert auch über die Funktion hin beibehält, habe ich mir die Frage doch selbst beantwortet.
    Dann wäre meine Frage unnütz.



  • @SeppJ
    "Guck dir auch mal an, was passiert, wenn du foo() mehrmals nacheinander aufrufst, jeweils mit und ohne static."...

    Hallo!

    Werde ich gleich ausprobieren.
    Danke



  • @tryn4x
    Function-local statics werden erzeugt wenn die Ausführung zum ersten mal die Stelle der Definition erreicht - und bei Programmende zerstört.

    Programmende ist erst nachdem die main Funktion verlassen wurde. Und beim Verlassen der main Funktion werden sämtliche lokalen Variablen der main Funktion zerstört.

    Und daher halt erst ~B (beim Verlassen der main Funktion) und dann erst ~C (nach dem Verlassen der main Funktion).



  • @hustbaer
    Vielen Dank.


Anmelden zum Antworten