Ein interessanter Fall von Delete and Destructor (C ++)

Ich habe ein Stück Code, in dem ich den Destruktor mehrmals aufrufen und auf Member-Funktionen zugreifen kann, selbst wenn der Destruktor aufgerufen wurde und die Werte der Member-Variablen erhalten bleiben. Nachdem ich angerufen hatte, konnte ich immer noch auf Mitgliederfunktionen zugreifendelete Die Mitgliedsvariablen wurden jedoch auf Null gesetzt (alle auf 0). Und ich kann nicht verdoppelndelete. Bitte erläutern Sie dies.

#include <iostream>
using namespace std;

template <typename T>
void destroy(T* ptr)
{
    ptr->~T();
}

class Testing
{
public:
    Testing() : test(20)
    {

    }

    ~Testing()
    {
        printf("Testing is being killed!\n");
    }

    int getTest() const
    {
        return test;
    }

private:
    int test;
};

int main()
{
    Testing *t = new Testing();
    cout << "t->getTest() = " << t->getTest() << endl;

    destroy(t);
    cout << "t->getTest() = " << t->getTest() << endl;

    t->~Testing();
    cout << "t->getTest() = " << t->getTest() << endl;

    delete t;
    cout << "t->getTest() = " << t->getTest() << endl;

    destroy(t);
    cout << "t->getTest() = " << t->getTest() << endl;

    t->~Testing();
    cout << "t->getTest() = " << t->getTest() << endl;

    //delete t; // <======== Don't do it! Double free/delete!
    cout << "t->getTest() = " << t->getTest() << endl;

    return 0;
}

Antworten auf die Frage(6)

Ihre Antwort auf die Frage