Um caso interessante de exclusão e destruidor (C ++)

Eu tenho um pedaço de código onde posso chamar o destruidor várias vezes e acessar funções-membro, mesmo que o destruidor tenha sido chamado com os valores das variáveis-membro preservados. Ainda consegui acessar as funções de membro depois que ligueidelete mas as variáveis de membro foram anuladas (todas para 0). E eu não posso dobrardelete. Por favor, explique isso.

#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;
}

questionAnswers(6)

yourAnswerToTheQuestion