Reihenfolge der Objektzerstörung im Destruktor



  • Hiho,

    ich habe eine kurze Frage zur Reihenfolge der zerstörung von Memberobjekten.

    class Foo
    {
        A a;
        B b;
    };
    

    Ist irgendwie im Standard festgelegt, dass zuerst a und dann b erzeugt wird und beim Zerstören zuerst b dran glauben muss und danach a, oder ist die Reihenfolge beliebig vom Compiler wählbar?

    MfG Pellaeon



  • Der Standard sagt in 12.4 6

    Bases and members are destroyed in the
    reverse order of the completion of their constructor (see 12.6.2)



  • Also wäre die Frage, ob garantiert ist, dass a vor b erzeugt wird?

    MfG Pellaeon



  • Ich denke, dass die Reihenfolge alleine durch das Layout der Klasse vorgegeben ist.
    Die Initialisierung findet also in der Reihenfolge der Deklaration statt, die Destruktion muss genau anders herum laufen. Der Compiler kann zwar zusätzliche Bytes einschieben (padding), ein Umsortieren der Elemente ist ihm aber imho nicht erlaubt.
    http://codepad.org/FO90kE8C
    Beim MSVC kann sogar der Kontruktor MyC folgendermaßen aussehen:

    MyC() : c3(), c2(), c1() {}
    

    Die Reihenfolge bleibt die Gleiche.



  • Und da wird keine Warnung geworfen, dass die Initialisierungsliste nicht die Reihenfolge der Member beruecksichtigt?



  • gcc 4.5 wirft zumindest bei -Wall eine Warnung, falls man die Elementinitialisierungsliste im Konstruktor anders sortiert als in der Klassendefinition. Er weist dann freundlich darauf hin, dass er die Reihenfolge der Initialisierungsliste _nicht_ beachtet, sondern nur die der Klassendefinition. Das ist die berühmte "will be initialized after"-Warning.

    Phil



  • knivil schrieb:

    Und da wird keine Warnung geworfen, dass die Initialisierungsliste nicht die Reihenfolge der Member beruecksichtigt?

    Nein, leider nicht.

    Aber wenn man sich grundsätzlich angewöhnt Membervariablen und Initialisierungsliste in der gleichen Reihenfolge (und vollständig) zu halten, reduziert man die Fehlergefahr auch ohne Warnung.



  • Pellaeon schrieb:

    Also wäre die Frage, ob garantiert ist, dass a vor b erzeugt wird?

    a wird garantiert vor b initialisiert.
    Achte mal auf Deinen Satzbau/Grammatik. :p


Anmelden zum Antworten