PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Warning, class has virtual methods, but non virtual destructor



axeljaeger
08-12-2002, 20:01
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.

micha
08-12-2002, 21:25
Hi,

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

Gruß micha

axeljaeger
09-12-2002, 12:47
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?

anda_skoa
09-12-2002, 13:20
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



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,
_

axeljaeger
09-12-2002, 13:26
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.

anda_skoa
09-12-2002, 14:41
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,
_

axeljaeger
09-12-2002, 17:34
Das hat schonmal geholfen! Ich hoffe, meinen eigentlichen Fehler auf 100 Zeilen Code eingrenzen zu können, das ich ihn dann hier posten kann