Wofür ein Destructor?

  • C++

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von KidRick.

    Wofür ein Destructor?

    Hallo,
    naja vielleicht eine Anfängerfrage in C++ aber ich habe es bisher nie wirklich "richtig" verstanden. Wie benutze ich einen Destructor richtig? Sagen wir mal ich hab folgenden Header:

    C-Quellcode

    1. #pragma once
    2. #include <QMenu>
    3. class QClass1 {
    4. public:
    5. QClass1();
    6. ~QClass1();
    7. QMenu *someMenu;
    8. } ;


    Wenn ich jetzt nun im Konstruktor folgendes mache:

    C-Quellcode

    1. QClass1::QClass1() {
    2. someMenu = new QMenu("Menu", this);
    3. }


    Müsste ich dann im Destruktor folgendes tun?:

    C-Quellcode

    1. QClass1::~QClass1() {
    2. delete someMenu;
    3. }


    Soweit wie ich das verstanden habe muss ich alle Sachen die ich mit new allocate, im Destruktor mit delete deallocaten. Wäre nett wenn mir das jemand so richtig erklärt :)

    Grüße
    Software being "Done" is like lawn being "Mowed". (Jim Benson)
    @KidRick Das ist korrekt.
    Alles, was mit new instanziiert wurde, muss mit delte weggeräumt werden.
    Klassenvariablen werden im Destruktor final beräumt. Wenn Du die dieselbe Variable neu instanziierst, musst Du sie vorher ebenfalls mit delete beräumen. Am besten geht das so:

    C-Quellcode

    1. if (someMenu != null)
    2. {
    3. delete someMenu;
    4. }
    5. someMenu = new QMenu("Menu", this);

    Instanz-Variablen, die Du nur innerhalb einer Prozedur verwendest, musst Du vor dem return zerstören.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Der Destruktor wird aufgerufen, wenn Dein Objekt stirbt. ;) Dazu zählt dann die Beendigung des Programms, Erreichen des Endes vom aktuellen Scope, explizite Löschung via delete, etc.
    Er ist dazu da, verwendete Ressourcen freizugeben und da fallen dann auch entsprechende Pointer drunter. Wenn Du keinen erstellst, dann macht das der Compiler für Dich.

    Interessant ist sicher in dem Kontext auch auto_ptr, unique_ptr, shared_ptr etc.
    Ansonsten steht eigentlich auf der offiziellen Reference alles dazu.

    Anzumerken ist noch, dass Du in einer Basisklasse den Destruktor als überschreibbar (virtual) markieren solltest.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Trade schrieb:

    Anzumerken ist noch, dass Du in einer Basisklasse den Destruktor als überschreibbar (virtual) markieren solltest.

    Danke dafür, hatte mich schon gewundert ;)
    Software being "Done" is like lawn being "Mowed". (Jim Benson)