Destructor einer Klasse manuell aufrufen, die man als Template angibt



  • Hoi,

    Ich habe folgendes Problem.

    Folgende Situation:

    class a {
    public:
    
    a(){};
    ~a(){};
    
    };
    
    template<typename t>
    class b {
    public:
    b(){};
    ~b(){m_t.//????  hier möchte ich den Destructor von m_t aufrufen aber wie geht das
    
    t m_t;
    
    };
    


  • Du brauchst den Destruktor nicht explizit aufzurufen. Er wird automatisch aufgerufen, wenn der Destruktor der Klasse aufgerufen wurde.



  • Falls es explizit sein muss: Mitgliedsvariable als Zeiger deklarieren und den Zeiger zerstören:

    template <typename T>
    class B {
        T* m_t;
    
    public:
        // ...
        void Dispose() // ;-)
        {
            delete m_t;
        }
    };
    


  • @Rudolph: Deinen Vorschlag kann ich leider net machen, wie du im nächsten Abschnitt sehen wirst.

    In meiner Array-Klasse kann man wählen, ob die Constructoren aufgerufen werden oder nicht. Ich benutze dann dementsprechend (T*) malloc(x*sizeof(T)) oder
    new T[x].

    Nun möchte ich auch, dass man wählen kann ob der Destructor aufgerufen wurde.

    Da wäre ich auch schon bei meiner nächsten Frage.
    Wenn man Speicher der mit new[] angefordert hat, sollte man ihn dann nicht mit free freigeben weil dann der Destructor nicht aufgerufen werden würde oder
    ist es einfach falsch.

    mfg



  • Bock schrieb:

    In meiner Array-Klasse kann man wählen, ob die Constructoren aufgerufen werden oder nicht. Ich benutze dann dementsprechend (T*) malloc(x*sizeof(T)) oder
    new T[x].

    Nun möchte ich auch, dass man wählen kann ob der Destructor aufgerufen wurde.

    nein. Wenn du schon den Ctor nicht aufgerufen hast, brauchst du auch keinen Dtor aufrufen. D.h. die Entscheidung ist abhängig von der Entscheidung ob Ctor oder nicht zu treffen und sollte nicht im Ermessen des Benutzers der Klasse liegen.

    Da wäre ich auch schon bei meiner nächsten Frage.
    Wenn man Speicher der mit new[] angefordert hat, sollte man ihn dann nicht mit free freigeben weil dann der Destructor nicht aufgerufen werden würde oder
    ist es einfach falsch.

    So ist es.

    new <-> delete
    new [] <-> delete []
    malloc, calloc, realloc <-> free

    Wirklich NICHT mischen.

    MfG

    GPC



  • Hallo,
    den Destruktor kann man wie folgt explizit aufrufen:

    T anObject;
    
    anObject.~T();
    

    Erlaubt ist das aber nur in seltenen Fällen, z.B. wenn anObject per placement-new erzeugt wurde. Für automatische Objekte ist es Verboten. Objekte, die mit new angeleget wurden, müssen mit delete zerstört werden.

    Wenn man Speicher der mit new[] angefordert hat, sollte man ihn dann nicht mit free freigeben weil dann der Destructor nicht aufgerufen werden würde oder
    ist es einfach falsch.

    Es ist einfach falsch und führt zu undefiniertem Verhalten. Damit kann alles passieren: vom Absturz des Programms bis zum Absturz der MIR.



  • HumeSikkins schrieb:

    Damit kann alles passieren: vom Absturz des Programms bis zum Absturz der MIR.

    Die MIR ist doch bereits abgestürzt?! 😉



  • 😛 schrieb:

    Die MIR ist doch bereits abgestürzt?! 😉

    Da siehst du mal, was so ein Programmfehler alles ausrichten kann 😃 (scnr)


Anmelden zum Antworten