003
20.10.2005, 09:23 Uhr
virtual
Sexiest Bit alive (Operator)
|
Nein: im dtor von Deinem Beispiel passiert eigentlich überhaupt nix, es wird noch nicht mal speicher durch den Aufruf freigegeben. In freier Wildbahn gibt es eigentlich nur zwei Situation (es gibt zwar mehr, aber die folgenden sind die, die 99% der Fälle abdecken):
1. Die Variable ist mit new angelegt:
C++: |
test* bla = new test(12); delete bla;
|
In diesem Fall geht new hin, belegt sizeof(test) Bytes Speicher und ruft den entsprechenden Konstruktor der Klasse test auf. analog geht das delete bla hin und ruft den Destruktor auf und gibt anschliessend die zuvor belegten Bytes frei. Du brauchst also nur die Dinge im Destruktor rückgängig zu machen, welche du im Konstruktor gemacht hast.
2 Die Variable ist nicht mit new angelegt:
Hier hängt es von weiteren Typespecifieren ab, woher der Speicher der Variable kommt: Bei globalen Variablen ist der SPeicher irgendwo in einem Datensegment (BSS) zu finden, bei lokalen Variablen wird er im Stack angelegt. Bei globalen variablen wird der Konstruktor vor dem eintritt in main aufgerufen und der destruktor nach dem verlassen von main. Bei lokalen Variablen wird der konstruktor bei Eintritt der umgebenden geschweiften Klammer aufgerufen und der destructor beim verlassen derselben. Es wird jedoch kein Speicher "belegt", er ist quasi einfach da, genau wie der Speicher jeder primitiven lokalen Variable einfach da ist. Das ist der Grund, warum du in Deinem Programm auch nach dem dtor aufruf noch auf das Objekt zugreifen kannst: es ist speichertechnisch noch da, durch den dtor aufruf jedoch uninitialisiert und damit ist das Verhalten des Programms nicht mehr definiert. Dein programm könnte man in C so schreiben:
C++: |
char* bla = malloc(1); free(bla); *bla = 0;
|
Wird sehr häufig auch nicht abstürzen, ist aber hochgradig gefährlich. -- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) |