Bereich abbauen, Reihenfolge der Objekte



  • Hallo,

    wenn ich eine Funktion verlasse, werden ja die Destruktoren der Objekte gerufen. In welcher Reihenfolge geschieht dies und ist diese definiert?
    Hintergrund ist folgender. Ich habe in meiner Funktion ein Objekt und lege ein weiteres an, welches das erste Objekt beim verlassen der Funktion auswerten soll. Der Wert, der ausgewertet werden soll, ist ein int . Also in dem Fall kein Objekt.

    Gruß



  • wie folg

    Objekte die erstellt werden:

    Objekt 1
    Objekt 2
    Objekt 3

    und die werden dann rückwärts abgebaut.

    wenn die verschachtelst Objekt1(Objekt2(Objekt3)) muss das Objekt 3 zuerst zerstört werden, da Objekt 2 darauf zugreift wirft er dir dann nen Error, falls Objekt 2 vorhergelöscht werden würde



  • wenn ich eine Funktion verlasse, werden ja die Destruktoren der Objekte gerufen. In welcher Reihenfolge geschieht dies und ist diese definiert?

    In der umgekehrten Reihenfolge in der die Variablen definiert wurden.



  • Und das ist mir auch garantiert, solange der Compiler Standardkonform ist?



  • Nick Unbekannt schrieb:

    In welcher Reihenfolge geschieht dies und ist diese definiert?

    In umgekeherter Reihenfolge. Das, was Du zuletzt im automatischen Speicher angelegt hat, wird zuerst wieder zerstört, u.s.w.

    Nick Unbekannt schrieb:

    Ich habe in meiner Funktion ein Objekt und lege ein weiteres an, welches das erste Objekt beim verlassen der Funktion auswerten soll. Der Wert, der ausgewertet werden soll, ist ein int . Also in dem Fall kein Objekt.

    Ein Wert ist ein Wert und ein Objekt ist ein Objekt. Du kannst natürlich ein int-Objekt verwenden, um einen Wert zu speichern. Der Begriff Objekt beschränkt sich in C++ nicht auf Klassen-Typen.

    §1.8/1

    The constructs in a C++ program create, destroy, refer to, access, and manipulate objects. An object is a region of storage. [ Note: A function is not an object, regardless of whether or not it occupies storage in the way that objects do. —end note ] An object is created by a definition (3.1), by a new-expression (5.3.4) or by the implementation (12.2) when needed. The properties of an object are determined when the object is created. An object can have a name (clause 3). An object has a storage duration (3.7) which influences its lifetime (3.8). An object has a type (3.9). The term object type refers to the type with which the object is created. Some objects are polymorphic (10.3); the implementation generates information associated with each such object that makes it possible to determine that object’s type during program execution. For other objects, the interpretation of the values found therein is determined by the type of the expressions (clause 5) used to access them.



  • Bei abgeleiteten Objekten in umgekehrter Reihenfolge. Bei mehreren einzelnen Objekten bin ich mir nicht sicher, ob der Compiler die von dir erstellten Objektreihenfolgen nicht durch Optimierung ändert.

    //Funktion
    Obj obj1;
    Obj obj2;
    
    //mache etwas mit obj2
    
    //mache etwas mit obj1
    

    könnte eventuell auch optimiert werden?

    //Funktion
    Obj obj2;
    //mache etwas mit obj2
    
    Obj obj1;
    //mache etwas mit obj1
    

    Somit würde sich eine andere Ablage auf dem Stack ergeben...



  • krümelkacker schrieb:

    In umgekeherter Reihenfolge. Das, was Du zuletzt im automatischen Speicher angelegt hat, wird zuerst wieder zerstört, u.s.w.

    Ja das ist soweit klar. Nur haben ja die Daten auf dem Stack keine Verbindung zu den Funktionen, in dem Fall die Methoden des Objektes. Aber es leuchtet natürlich ein, dass der Compiler den Destruktor rufen muss, bevor die Daten vom Stack verschwinden.
    Was gar keine andere Vorgehensweise möglich macht.

    @stacksuxx
    Der Compiler sollte eigentlich merken, wenn ein Datum von einem anderen abhängig ist. Die Logik darf sich durch die Optimierung nicht ändern. Ausnahmen sind flüchtige Werte, da weiß der Compiler nicht was passiert und darf sie dementsprechend auch nicht optimieren.


Anmelden zum Antworten