Reihenfolge der Destruktor-Aufrufe



  • Hallo,

    wie ist die Aufrufreihenfolge bei Destruktoren? Ich hätte erwartet, dass sie umgekehrt zur ctor Reihenfolge ist, also nicht "~Basisklasse() -> ~ErbendeKlasse()" sondern ~ErbendeKlasse() -> ~Basisklasse()".

    Scheinbar ist dem nicht so 😕

    Hier die Situation wo dies Auftritt:

    Es gibt eine per Mutex geschützte Verwaltungsklasse, bei der sich Objekte u.a. ein- und austragen können. Das Eintragen erfolgt bei bestimmten Klassen im Konstruktor, dass Austragen im Destruktor.
    Immer wenn irgendeine Methode dieser Klasse aufgerufen wird, wird das Mutex gelocked.

    Jetzt habe ich folgende Situation: Jemand fragt bei der Verwaltungsklasse an "zeig mir doch mal bitte alle die sich angemeldet haben und gib auch alle Attribute mit aus". Das Mutex wird also gelocked und die Verwaltungsklasse schaut in all ihren Listen nach und fragt die gespeicherten Objekte nach ihren Attributen.

    Genau in diesem Moment wird ein Objekt gelöscht, welches sich dann bei der Verwaltungsklasse abmelden möchte. Da das Mutex gesperrt ist, hängt der Destruktor dieses Objekts weil es darauf wartet sich das Mutex zu schnappen. Nun hätte ich erwartet, dass das Objekt aber noch vollständig vorhanden ist, und zwar genau so lange bis der Destruktor durchlaufen wird.

    Kommt jetzt aber die Verwaltungsklasse in seiner Liste bei der Klasse an, die sich gerade austragen möchte und momentan wartet, können noch genau alle Attribute von dieser Klasse ausgegeben werden, sobald die Verwaltungsklasse aber auf geerbte Attribute zugreifen möchte, knallt es.

    So als ob der Rest schon gelöscht wurde.

    Ich hab versucht dem ganzen mit Testausgaben auf die Schliche zu kommen, aber das ist recht undurchsichtig. Es wird scheinbar tatsächlich der Destruktor der Basisklasse aufgerufen 😮 Was mich total irritiert ist, dass die Basisklasse eine andere Adresse zu haben scheint als die Erbende. Sprich wenn ich mir im dtor der Basisklasse den this Zeiger ausgeben lasse und in der Erbenden, dann stehen da unterschiedliche Adressse. Das kann doch eigentlich gar nicht sein, oder?

    Ich hoffe ihr wisst was ich meine, vielleicht kann mir ja jemand helfen 🙄 🙂



  • Nein, ich weiß nicht, was du meinst. Eventuell wird es klarer, wenn du etwas Code zeigst 😉

    (das mit den unterschiedlichen Adressen könnte übrigens an Mehrfachvererbung liegen - die Bestandteile der Mutterklassen landen hintereinander im Speicher und dann rechnet der Compiler für jede Mutterklasse aus, wo ihr jeweiliger Speicherbereich beginnt und verschiebt den this-Zeiger entsprechend)



  • wie ist die Aufrufreihenfolge bei Destruktoren? Ich hätte erwartet, dass sie umgekehrt zur ctor Reihenfolge ist

    Genau so ist es. Destruktoren abgeleiteter Klassen laufen vor den Destruktoren von Basisklassen.

    Dein Problem hat also eine andere Ursache.



  • Okay, dann schaue ich nochmal weiter...


Anmelden zum Antworten