Freigabe ohne virtuellen Destruktor
-
Hi.
Man hat einen Basisklassenzeigertyp der auf ein Objekt einer abgeleiteten Klasse zeigt. Beim Zerstören wird der Destruktor in der abgeleiteten Klasse nur aufgerufen, wenn in der Basisklasse ein virtueller Destruktor vorhanden ist. Das ist soweit bekannt.
Aus theoretischem Interesse: Angenommen die beiden Klassen haben ansonsten keine weiteren Ressourcen mehr freizugeben, in ihren Kostruktoren also z.B. nichts mit new reserviert. Wird bei nicht vorhandenem virtuellem Destruktor trotzdem der ganze Speicher freigegeben, den das Objekt belegt?
Oder wird evtl nur so viel Speicher freigegeben, wie sizeof(Baseclass) belegt?Thx
-
Das kann ich zwar nicht beantworten, aber ein Hinweis: Mit new erzeugten Speicher musst du mit delete freigeben. Das passiert auch bei Vorhandensein eines Desturktors nicht automatisch.
-
Das ist klar und nicht die Frage!
-
vDest schrieb:
Das ist klar und nicht die Frage!
Aus deinem Text ging nicht klar hervor, ob du das wirklich verstanden hast, deshalb wollte ich das nochmal klarstellen. Das das nciht die eigentliche Frage war, weiß ich - das habe ich ja auch geschrieben.
Noch ein kleiner Tipp: Unhöflichkeit ist recht kontraproduktiv, wenn man andere um Hilfe bittet...
-
Daran war nichts unhöflich.
-
Wird ein Objekt ohne virtuellen Destruktor über einen Basiklassenzeiger zerstört, dann ist das Verhalten undefiniert. Punkt. Eigentlich bräuchte man gar nicht mehr weiter zu diskutieren.
Man kann jedoch sagen, was in einer normalen Implementierung passieren wird: Es werden nur die Destruktoren der Member der Basisklasse aufgerufen. Dies wird zu Problemen führen, wenn die Destruktoren der Member der abgeleiteten Klasse nichtrivial sind.new und delete haben damit erst einmal nichts direkt zu tun, außer dass sie ein möglicher Grund für nichttriviale Destruktoren sein können. Falls du Angst hast, das ein delete über einen unpassenden Zeiger nicht allen Speicher eines vorherigen new freigibt, so wird bei gängigen Implementierungen doch immer die richtige Menge (nämlich alles) freigegeben. Denn die Mechanismen dahinter merken sich i.d.R. nur die Menge, keine Typinformation.
Das ist aber keine Freifahrschein. Wie schon gesagt, gibt es zwei gravierende Nachteile:
1. Falsche Destruktoren werden aufgerufen -> Chaos
2. Das beschriebene Verhalten ist nur bei manchen Plattformen so und nirgends definiert. Im C++-Standard ist das Verhalten ausdrücklich undefiniert. -> Chaos
-
Danke für die erhellende Antwort.

Hintergrund war schlicht und einfach theoretisches Interesse.