[Debug Error] Abnormal program termination



  • Hi,

    könnt ihr mir sagen, was an dem unten stehenden Code ein Problem für
    den Rechner ist? Ich weiss leider nur soweit, dass der dynamic_cast den
    Ärger bereitet, verstehe aber nicht weshalb.

    Danke im Voraus,
    Khadgar

    #include <iostream>
    #include <string>
    using namespace std;
    
    class Tier {
    public:
        Tier() {}
        Tier(int pAlter) { thisAlter = pAlter; }
        ~Tier() { cout << "... Tier Destruktor\n"; }
        void SetzeAlter(int pAlter) { thisAlter = pAlter; }
        int HoleAlter() const { return thisAlter; }
        virtual void Sprich() const { cout << "Tier spricht\n"; }
    protected:
        int thisAlter;
    };
    
    class Hund : public Tier {
    public:
        Hund() {}
        Hund(int pAlter) { thisAlter = pAlter; }
        ~Hund() { cout << "... Hund Destruktor\n"; }
        void Sprich() const { cout << "Wuff\n"; }
        void Knurr() const { cout << "Grrr\n"; }
    };
    
    int main() {
    
        Tier * pTier;
        pTier = new Hund();
    
        Hund * pHund;
        pHund = dynamic_cast< Hund * > (pTier);
        pHund->Knurr();
    
        delete pTier;
        delete pHund;
    
        return 0;
    }
    


  • virtual destructor



  • Hm, also bie mir (GCC 3.2 auf cygwin) läufts so durch mit der Ausgabe:

    Grrr
    ... Tier Destruktor
    ... Hund Destruktor
    ... Tier Destruktor
    

    Wobei ich nicht weiß, ob es gut ist, dass du dasselbe objekt zweimal löschst



  • rtti aktivieren



  • delete pTier;
    delete pHund;

    du löscht das objekt ja zweimal.



  • Original erstellt von <grr>:
    rtti aktivieren

    guter hinweis.. fürs studio:

    Rufen Sie für Ihr Projekt den Befehl Projekt/Einstellungen auf.
    Gehen Sie zu der Registerkarte C++.
    Wählen Sie die Kategorie: Programmiersprache C++ aus.
    Setzen Sie die Option Run-Time-Type-Informationen (RTTI) aktivieren.
    Kompilieren Sie das gesamt Projekt neu.



  • Ok, danke erstmal für Eure schnelle Hilfe!!

    Zu der Kritik am doppelten Delete:
    Das Programm erreicht die Delete-Anweisungen nicht:
    Die Verarbeitung stoppt genau beim Umwandeln durch den dynamic_cast.

    Bezüglich der RTTI:
    Was genau ist das?
    Wofür brauche ich das?

    Bezüglich CGG 3.2:
    Ich arbeite mit VC++ 6... ist das schlimm?
    Für Java nutze ich Borland: Sollte ich für C auch?

    Danke im Voraus,
    Khadgar



  • Original erstellt von elise:
    **guter hinweis.. fürs studio:

    Rufen Sie für Ihr Projekt den Befehl Projekt/Einstellungen auf.
    Gehen Sie zu der Registerkarte C++.
    Wählen Sie die Kategorie: Programmiersprache C++ aus.
    Setzen Sie die Option Run-Time-Type-Informationen (RTTI) aktivieren.
    Kompilieren Sie das gesamt Projekt neu.**



  • Ok, mit zugeschaltetem RTTI läuft das ganze zumindest.
    Danke Euch allen!!



  • RTTI = Run Time Type Information
    also alles, was mit

    typeid typeinfo und dynamic_cast
    

    zu tun hat 🙂



  • Dank dir!


Anmelden zum Antworten