Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Objektnutzung nach Destruktoraufruf

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
20.10.2005, 08:33 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Hi,

In Sachen C++ bin ich noch recht neu, und hab gerade mal en bissel was Nutzloses zusammengetippt, was mein Problem verdeutlicht.
Nachdem ich mit den Konstruktor ein Objekt erzeugt habe, kann ich damit auf die Methoden und Membervariablen der Klasse zugreifen. Und nach dem aufruf des Destruktors sollte es doch wieder weg sein, oder? Muss in dm Destruktor was bestimmtes stehen? Weil ich sehe zwar, das der Destruktor aufgerufen wurde, kann das Objekt danach aber immer noch verwenden.
Hier mein Code:

C++:
#include <iostream>
using namespace std;

class test {
private:
    char *i;
public:
    test(int a) {
        cout << "Uebergabe an Konstruktor: " << a << endl;
    }

    void test::methode1() {
        cout << "Das ist die erste Methode aus der Klasse test" << endl;
        i = "Hallo";
    }

    test::~test() {
        cout << "Objekt Kaputt..." << endl;
        cout << i << endl;
    }
};

int main(int argc, char* argv[]) {
    test bla(13);
    bla.methode1();
    cout << "Dateiname: " << argv[0] << endl;
    bla.~test();
    bla.methode1();
    return 0;
}



Dank euch schonmal für eure Hilfe
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
20.10.2005, 09:01 Uhr
virtual
Sexiest Bit alive
(Operator)


Im Destruktor gibt man Resourcen frei, welche man zuvor belegt hatte (zB Speicher, Dateihandles). Da du keine Resourcen belegt hast, brauchst Du auch nichts explizites freizugeben. Würdest Du Dich entscheiden, den member "i" mit malloc zu belegen, wäre der Destruktor dafür verantwortlich, free zu machen.

Die von Dir gezeigte Konstruktionwürde man in einem C++ Programm wohl auch nur sehr selten/überhaupt nicht anwenden: ein expliziter Destructoraufruf auf eine lokale Variable verbietet sich sowieso völlig, weil der Destructor am Ende des Gültigkeitsbereichs ohnehin aufgerufen wird:

C++:
{
   test bla; // ctor

    ...
} // Impliziter dtor



Etwas mehr sinn macht das Programm, wenn Du das Objekt dynamisch anlegst:

C++:
   test* bla = new test;
   ...
   delete bla;
   bla->methode1();


Das ist natürlich auch nicht legal, bla ist ein dangling Pointer nach dem delete und damit nicht mehr gültig.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
20.10.2005, 09:07 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Ah, okay. dank dir. Also wird nur der Speicher geräumt, aber das Objekt gibt es dann immer noch?!
Okay, wenn es so ist, dann hab ich es vertanden, thx !
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
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:

C++:
test bla;


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)
 
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: