Destruktor Aufrufe
-
Hey Leute,
ich habe eine kurze Frage zu den automatischen Destruktoraufrufen und zwar betrachte man folgenden Code
class A { ~A() {}; }; class B: public A{ ~B() {}; }; A* b = new B(); delete b;Hier wird, wenn ich das richtig verstanden habe, bei "delete b" direkt der Destruktor von Klasse A aufgerufen, da der Destruktor in A nicht virtual ist oder?
Angenommen dieser ist virtual, also der Code sehe folgendermaßen aus
class A { virtual ~A() {}; }; class B: public A{ ~B() {}; }; A* b = new B(); delete b;Dann wird der Destruktor von B aufgerufen oder?
Ruft dieser anschließend auch automatisch den Destruktor von A auf und würden, falls man meine eine ganze Vererbungshierarchie betrachtet, alle Destruktoren bis zur Spitze dieser Hierarchie aufgerufn werden??Gruß

-
Ja. Anschließend wird automatisch der Konstruktor von A aufgerufen. Das gilt für alle geschchtelten Klassen.
Die Frage ist nur welcher Destruktor ist der erste der aufgerufen wird. Nur virtual garantiert das die äußere Klasse zuerst abgeräumt wird. Sonst muss man casten.
-
Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum C++ (auch C++0x und C++11) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Martin Richter schrieb:
Die Frage ist nur welcher Destruktor ist der erste der aufgerufen wird. Nur virtual garantiert das die äußere Klasse zuerst abgeräumt wird.
Ne, die äußeren Destruktoren werden immer zu erst aufgerufen, nur ohne virtual wird der Destruktor von B halt gar nicht bemüht.
http://ideone.com/xWnJc
http://ideone.com/w6BcN
-
Danke für deine Antwort, hatte jetzt auch die Möglichkeit es selbst zu testen

-
@cooky451
Martin hat das etwas unglücklich formuliert, aber ihr meint beide das selbe.
-
MatheStein schrieb:
class A { ~A() {}; // <-- kk: hier kommt kein Semikolon hin }; class B: public A { ~B() {}; // <-- kk: hier kommt kein Semikolon hin }; A* b = new B(); delete b;Hier wird, wenn ich das richtig verstanden habe, bei "delete b" direkt der Destruktor von Klasse A aufgerufen, da der Destruktor in A nicht virtual ist oder?
Nein. Was bei dem Programm passiert, ist undefiniert. Wenn Du polymorph löschen willst, muss der Destruktor des statischen Typs von *b, also A, virtuell sein. Alles andere ist Murks und Du kannst Dich da auf nichts verlassen, weil das Verhalten undefiniert ist.
MatheStein schrieb:
Angenommen dieser ist virtual, also der Code sehe folgendermaßen aus
class A { virtual ~A() {}; }; class B: public A { ~B() {}; }; A* b = new B(); delete b;Dann wird der Destruktor von B aufgerufen oder?
Ruft dieser anschließend auch automatisch den Destruktor von A auf und würden, falls man meine eine ganze Vererbungshierarchie betrachtet, alle Destruktoren bis zur Spitze dieser Hierarchie aufgerufn werden??Ja und Ja.