Хотите еще более клевую штуку покажу?
int main(int argc, char *argv[])
{
ttt *t = new ttt();
t->foo();
delete t;
t->foo();
return 0;
}
Выводит
Alive 0x55d7770d0c20
Removing
Alive 0x55d7770d0c20
( собирал чем попало ).
При вызове деструктора для объекта никто не обязан как-то его "разрушать", скажем занулять область памяти, где он лежал. Это просто договоренность с программистом, что объект удален и обращаться к нему не надо. Что будет если обратиться? Undefined behaviour, частный случай которого мы с вами и наблюдаем.