delete -> crash :(



  • Hallo zusammen!

    Mir ist mal wieder etwas recht merkwürdiges aufgefallen!
    Dass der delete-Operator bei Pointern virtueller Klassen Probleme macht, musste ich ja schon mal schmerzhaft erfahren. Nur wie sieht es denn in folgendem Fall aus:

    .                                
                      .               in der Hierarchie tauchen
                      .                weiter oben virtuelle     
                      ^                    Klassen auf!
                      |
                      |
                andere Klasse
                      ^
                      |
                      |
                ClippingVolume         ----+
                      ^                    |  
                      |                    +-- das sind die beiden
                      |                    |   Klassen, auf die es
            PerspectiveClippingVolume  ----+   ankommt!
                                               Wichtig: nicht virtuell!
                                               Also ganz normal:
                               'PerspectiveClippingVolume : public ClippingVolume'
    

    Jetzt entsteht dabei folgendes Problem:

    PerspectiveClippingVolume *volume=new PerspectiveClippingVolume();
    delete volume; // Kein Problem! Läuft!
    
    //ABER:
    //-----
    //Bei folgender Vorgehensweise:
    ClippingVolume *volume=new PerspectiveClippingVolume();
    delete volume; // Zugriffsverletzung!
    

    Könnte mir bitte jemand erklären, warum denn so ein Fehler auftritt?
    Denn ein derartiger Problemfall ist mir noch nie untergekommen!

    Danke!

    Grüße,
    TS++



  • was meinst du denn mit virtuell? als "virtual" vererbt?
    kann sein, dass vielleicht irgendwo eine funktionsdefinition fehlt, und der linker es nicht merkt (kann ja alles vorkommen)
    was genau passiert denn? wie genau ist denn die hierarchie?
    kurz: mehr infos bitte, denn an sich sieht dein beispiel ganz ok aus.

    achja muss sich nicht bei virtualler vererbung immer die nächste abgeleitete klasse, die zwei basisklassen vereint sich um den passenden konstruktoraufruf kümmern? könnte ein hinweis sein.



  • Servus davie!

    Da hab ich mich vielleicht etwas ungünstig ausgedrückt!
    Auf den höheren Ebenen meiner Klassenhierarchie wird auf jeden Fall virtuell vererbt. Die Aufrufreihenfolge der Konstruktoren spielt allerdings an dieser Stelle keine Rolle, da die betroffenen Klassen lediglich über Standardkonstruktoren verfügen. Ich muss die Reihenfolge also nicht extra angeben. Das kann das Problem nicht sein. Viele Klassen der angesprochenen Hierarchie verfügen ebenso über virtuelle, teilweise sogar abstrakte, Routinen. Ich hätte eigentlich gedacht, dass mir in Verbindung mit diesen Methoden kein Fehler unterlaufen ist. Doch wie ich gerade festgestellt habe, hab ich nicht allen Klassen, die über virtuelle Funktionen verfügen, virtuelle Destruktoren zugeordnet. Gut, in vielen Fällen muss ich das auch nicht unbedingt! Nur im aktuellen Fall hab ich jetzt mal zu Testzwecken bei allen Klassen mit virtuellen Methoden virtuelle Destruktoren mit eingebaut. Und siehe da: Der Fehler ist verschwunden!:)
    Dann waren offensichtlich wirklich nur fehlende Destruktorenaufrufe für die ganze Misere verantwortlich!
    => Ab sofort setze ich lieber wirklich bei jeder Klasse mit virtuellen Methoden einen virtuellen Destruktor!!!

    Danke, dass Du dich gemeldet hast!

    Grüße,
    TS++


Anmelden zum Antworten