Because c++ never said said to erase deleted memory, delete just unallocates the memory. What you have there is a stray pointer, it points to a memory location that is no longer meaningful in it's previous context. If you were to have a much longer, and more complicated program, those values would eventually be overwritten, but for your program, nothing ever claims that memory and writes over it.
If you wanted to, you could just make a pointer and read through memory until you hit a piece of memory that for one reason or other can't be read by your program
Yes, do not forget that delete [] p only marks the memory spaces p points to as deallocated. Since p may still contain the address of the deallocated memory, after typing delete [] p, you should type p=0, so that p doesnt point to them anymore.