Destruktor funktioniert nicht !? oder doch?



  • Hab mal in der C++ FAQ gewühlt…

    Von HumeSikkins:

    Ein Destruktor ist das genaue Gegenteil vom Konstruktor. Er ist das Ende, der Tod, die Funktion, die ein lebendiges, eigenständiges Objekt nach (hoffentlich) verrichteter Arbeit zurück in ein Haufen Nichts verwandelt.

    Hab das ganze natürlich auch mal ausprobiert
    und nach der Erstellung des Objects den Destruktor aufgerufen, aber leider scheint der Destruktor das Object nicht „zerstören“ zu wollen… nicht einmal den Speicher hat er frei gegeben

    Es ist doch mit dem Destruktor möglich das Object während des Programmablaufes zu zerstören und den Speicher wieder frei zu geben .. oder hab ich das ganze falsch verstanden / im Gedächtnis?

    #include <iostream.h>
    
    class Class1
    {
     public:
     int X;
    
     Class1(int x);
     ~Class1() {cout << "Destruktor\n";}
    
    };
    
    Class1::Class1(int x)
    {
      X = x ;
    }
    
    int main()
    {
      Class1 Object1(5);
      cout << Object1.X << endl;     //5
    
      Object1.X = 7;
      Object1.~Class1();             //Destruktor macht nicht !?
      cout << Object1.X << endl;     //6
      cin.get();
      return 0;
    }
    


  • #include <iostream.h>
    
    class Class1
    {
     public:
     int X;
    
     Class1(int x);
     ~Class1() {cout << "Destruktor\n";}
    
    };
    
    Class1::Class1(int x)
    {
      X = x ;
    }
    
    void test()
    {
      Class1 Object1(5);
      cout << Object1.X << endl;     //5
    
      Object1.X = 7;
      cout << Object1.X << endl;     //6
    }
    
    int main()
    {
      test();
      cin.get();
      return 0;
    }
    

    Schau mal, ob Dein Destruktor jetzt aufgerufen wird.



  • Der Destruktor kann das Objekt nicht aus dem Speicher löschen. Der Destruktor ist die Funktionen, die beim zerstören des Objekts aufgerufen wird, der Konstruktor bringt auch keinen Speicher für das Objekt, das übernimmt jemand anders (bsp:new), er wird lediglich beimmerzeugen des Objekts aufgerufen.

    mfg



  • @ Destruktor

    das ist mir schon klar das er ausgeführt wird...
    aber welchen Sinn hat er, wenn er nur ausgeführt wird?

    ich sah seine Aufgabe darin das Object zu zerstören und den Speicher frei zu geben... anscheinend macht er nichts >> "Der Destruktor ist die Funktionen, die beim zerstören des Objekts aufgerufen wird"

    genauso wie der Konstruktor der das Object erstellt..

    wie kann ich dann ein Object zerstören und den Speicher frei geben?

    insane



  • wie kann ich dann ein Object zerstören und den Speicher frei geben?

    Mit dem Destruktor 😃



  • Klassen reservieren zu Lebzeiten häufig Speicher, der auch wieder frei gegeben
    werden muss. Das macht (meistens) der D'tor

    class foo
    {
    private:
      int *x;
    public:
      foo()  { x = new int; };
      ~foo() { delete x; };
    }
    


  • Nein. Das Objekt (so, wie du es erstellst), wird automatisch zerstört, wenn du den Gültigkeitsbereicht (den umgebenen Block) verlässt. Und wenn das Objekt zerstört wird, wird sein Destruktor aufgerufen.

    EDIT: Das "Nein" bezieht sich auf ein Post weiter oben.



  • Das Objekt wird automatisch zerstört, wenn du den Gültigkeitsbereicht verlässt

    💡 aha

    also {} ist die Lösung...
    Der Kon/Destruktor werden einfach nur aufgerufen um am Anfang sowie am Ende der "Lebenszeit" etwas auszuführen

    thx insane



  • insane_desire schrieb:

    #include <iostream.h>
    
    class Class1
    {
     public:
     int X;
    
     Class1(int x);
     ~Class1() {cout << "Destruktor\n";}
    
    };
    
    Class1::Class1(int x)
    {
      X = x ;
    }
    
    int main()
    {
      Class1 Object1(5);
      cout << Object1.X << endl;     //5
    
      Object1.X = 7;
      Object1.~Class1();             //Destruktor macht nicht !?
    TATÜ TATÜ TATÜ  cout << Object1.X << endl;     //6
      cin.get();
      return 0;
    TATÜ TATÜ TATÜ
    }
    

    Dein Programm produziert in den von mir eindeutig gekennzeichneten Zeilen undefiniertes Verhalten. Hier kann alles passieren. Vom Absturz bis scheinbar normales Verhalten (wie du es bei deinem Compiler erlebt hast).

    Der Destruktor zerstört das Objekt. Nach dem Ablauf des Dtors gibt es kein Objekt mehr. Nur noch toten Speicher. Jeder weitere Zugriff auf diesen Speicher (über Member des ehemaligen Objekts) hat undefiniertes Verhalten, also auch der automatische Aufruf des Dtors am Ende von main. Was du hier betreibst, kann man gut und gerne als Leichenfledderei bezeichnen.

    Der Ablauf ist so:
    1. Erst hast du toten Speicher.
    2. Dann wird ein Ctor aufgerufen. Dieser bewirkt die Inkarnation eines lebensfrohen Objekts.
    3. Mit dem Aufruf des Dtors heißt es wieder Asche zu Asche. Das Objekt wird zerdeppert. Es bleibt der tote Speicher.


Anmelden zum Antworten