When passed a pointer to a class it calls the class' destructor...which is probably bad. I can't think of a time you'd ever want to call a destructor other than when writing a memory manager.
The destructor is a member function that is automatically called just before a instance of that class is destroyed. This does not mean that the instance is always destroyed after the destructor, since you can (as seen above) call it manually. This merely means that you called the destructor of a instance.
If you want to "destroy" variables like that, you need to allocate them on the heap or properly scope them, store them in a STL container or do some memory management of your own.
The destructor for int does not modify the memory locations that the int occupied.
Therefore, as long as the stack space occupied by x is not overwritten between
lines 10 and 11 (which it isn't), those memory locations will still contain the same
values. Hence line 11 outputs 5, because nothing else wrote to those memory
locations.
Having said that, use of a variable after it has been destroyed is undefined
behavior, so technically speaking anything could happen and it would still be
considered "correct" from the compiler's standpoint.