Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Wann wir welcher Destruktor aufgerufen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
08.09.2003, 11:18 Uhr
typecast
aka loddab
(Operator)


Hallo

ich habe jede Menge Objekte die von der selben Basisklasse abgeleitet wurden. Jedes dieser Objekte hat einen eigenen Konstruktor, in dem die Aufräumarbeiten bewerkstelligt werden. In einer Handleklasse habe ich eine Liste

C++:
list<Basisklasse*> liste


mit der ich die Instanzen der Objekte verwalte. Im Destruktor der Handleklasse gehe ich die Liste durch und lösche mit delete alle Elemente. Jetzt meine Frage: Wird beim löschen auch tatsächlich der Konsturktor der abgeleiteten Klasse aufgerufen, oder wird der Destruktor der Basisklasse aufgerufen?
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.09.2003, 11:22 Uhr
Pablo
Supertux
(Operator)


Wird nicht der Destruktor automatisch aufgerufen, wenn das Objekt den gültigkeitsbereich verlässt bzw. wenn man den Speicher frei lässt? Ich gluabe, man kann nicht explizipt den Destruktor aufrufen, ich kann mich nicht mehr daran erinnern.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.09.2003, 11:23 Uhr
typecast
aka loddab
(Operator)


Normalerweise schon, aber ich habe ja Zeiger auf das Objekt. Da ist das glaube ich schon nötig.
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
08.09.2003, 11:51 Uhr
virtual
Sexiest Bit alive
(Operator)


@Pablo
Syntaktisch kann man den Destructor explizit aufrufen, in äußerst Seltenen Ausahmefällen wird dies auch gemacht.
@Loddab
Beim Aufruf von delete wird auch der Destructor aufgerufen, das ist ja der Clou von delete. Allerdings muß Du in der Basisklasse auch den Destructor virtuell machen, weil sonst wird nie der Destructor in den Ableitungen aufgerufen:

C++:
class A
{
public:
    ~A() { };
};
class B: public A
{
    char* ganz_viel_speicher;
public:
    B :A() { ganz_viel_speicher = new [1000000000]; };
    ~B() { delete [] ganz_viel_speicher; }
};

...
A* pb = new B;
....
delete pb; // Ruft nur A::~A() auf!!


Obiges Programm wäre zB fehlerhaft, weil das "virtual" beim Destructor von A fehlt. In diesem Zusammenhang:
Generell darf man also nicht von Klassen ableiten, die keinen virtuellen Destruktur haben; damit fallen insbesondere (nahezu?) alle STL Containerklassen als Basisklasse für irgendetwas aus.
--edit: fight the rightwriteerror
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 08.09.2003 um 11:55 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
08.09.2003, 12:20 Uhr
typecast
aka loddab
(Operator)


Und wie ist es wenn ich folgendes habe:

C++:
...
B* pb = new B;
list<A*> l
l.push_back(pb);
...
for (list<A*>::iterator  i = ...)
     delete (*i);



Wird da auch der Destruktor von A aufgerufen?
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
08.09.2003, 12:26 Uhr
virtual
Sexiest Bit alive
(Operator)


Ja, der dtor von A wird immer aufgerufen, der von B jedoch nur, wenn der in A virtuell ist.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 08.09.2003 um 12:26 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
08.09.2003, 12:35 Uhr
typecast
aka loddab
(Operator)


Ok vielen Dank.
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
08.09.2003, 12:45 Uhr
proga



Beim Anlegen einer neuen Instanz wird zuerst der Konstruktor der Basisklasse aufgerufen und dann der eigene. Beim Zerstören (z.B. durch delete) wird zuerst der eigene und danach der Destruktor der Basisklasse aufgerufen. Voraussetzung ist, wie virtual schon sagte, das Schlüsselwort "virtual" in der Destruktordeklaration.
Dieser Post wurde am 08.09.2003 um 12:47 Uhr von proga editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
08.09.2003, 12:52 Uhr
typecast
aka loddab
(Operator)


Moment. Der Konstruktor der Basisklasse wird doch nur dann aufgerufen, wenn man es expliziet angibt:

C++:
class B : public A
{
  B(Typ Parameter) : A(Parameter) {}
}


Beim Destruktor würde es doch ähnlich ablaufen, oder irre ich mich da?
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
08.09.2003, 12:56 Uhr
virtual
Sexiest Bit alive
(Operator)


Nein, ein ctor der Basisklasse wird immer aufgerufen. Wenn Du es nicht explizit machst, nimmt der Compiler einfach den Defaultctor, also den, der keine parameter erwartet. kannst du einfach dadurch nachprüfen, indem du den Defaultctor der Basisklasse mal private machst und guckst, was passiert...
Ansonsten gilt das von proga und mir gesagte bzgl. der ctor/dtor reihenfolge
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 08.09.2003 um 12:57 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: