Anzeige:
Ergebnis 1 bis 7 von 7

Thema: Warning, class has virtual methods, but non virtual destructor

  1. #1
    Registrierter Benutzer
    Registriert seit
    08.07.2002
    Beiträge
    719

    Warning, class has virtual methods, but non virtual destructor

    Warning, class has virtual methods, but non virtual destructor

    Ich suche gerade einen ganz hässlichen Segfault, seit Tagen durchkäme ich meinen Code,
    jetzt bin ich mal auf die Idee gekommen, alle Warnings mit -Wall anzuschalten.
    Die Konsole kommt gar nicht mehr mit dem Warnungenausdrucken nach. Hundertemale kommt
    diese Meldung. Ich würde die gerne abschalten, also richtig den Code korriegieren, nicht
    einfach die Warnmeldung abschalten. Ich verwende noch einen GCC 2.9x, der von MDK 8.2

    Ich hoffe, das ich mein Speicherleck dann finde.

  2. #2
    Registrierter Benutzer
    Registriert seit
    25.12.1999
    Ort
    Stuttgart
    Beiträge
    259
    Hi,

    dann deklariere den Deconstructor in den Klassen, die eine Warnung ausgeben doch als virtual ?

    Gruß micha
    IRC: irc.euirc.net #tux

  3. #3
    Registrierter Benutzer
    Registriert seit
    08.07.2002
    Beiträge
    719
    Ja, was passiert denn, wenn man einen Konstruktor als virtual definiert? Darf man das einfach so machen und was passiert, wenn ich dann von der Klasse erbe, mit dem Konstruktor?

  4. #4
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Den [u]De[/b]struktor mußt du virtual deklarieren

    Du machst das, damit der Destruktur der Klasse aufgerufen wird, auch wenn du einen Pointer der Basisklasse löscht

    Code:
    class base
    {
    public:
        base() {};
        virtual ~base() {};
    };
    
    class child : public base
    {
    public:
       child() {};
       virtual ~child() {};
    };
    
    int main
    {
        child* c = new child();
        base* b = c;
    
        delete b; // damit hier ~child() aufgerufen wird
    }
    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  5. #5
    Registrierter Benutzer
    Registriert seit
    08.07.2002
    Beiträge
    719
    ah, das bringt schonmal was vom Verständnis her. Aber wird, wenn ich c lösche auch der Desktruktor von base aufgerufen, oder muß ich den im Destruktor von base im Destruktor con child manuell aufrufen. Und - mein liebstes Beispiel - wie macht das Qt im QWidget? Das hat jede Menge virtuelle Methoden, aber keinen virtuellen Desktruktor.

  6. #6
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Du mußt den Destruktor der Basisklasse nicht selbst aufrufen.
    Das passiet automatisch, wie beim Konstruktor.

    Ich weiß nicht, warum bei QWidget tatsächlich kein virtual Desktruktor ist.
    Ist vielleicht nicht unbedingt nötig, der Compiler gibt ja auch nur ein Warning.

    Aber schaden kanns nicht, denk ich mir

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  7. #7
    Registrierter Benutzer
    Registriert seit
    08.07.2002
    Beiträge
    719
    Das hat schonmal geholfen! Ich hoffe, meinen eigentlichen Fehler auf 100 Zeilen Code eingrenzen zu können, das ich ihn dann hier posten kann

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •