Since you don't provide a copy constructor for PInt, the compiler provides one for you. The compiler-provided constructor will just copy the values of your variables n and id. Since n is a pointer, you end up with two PInt's that point to the exact same memory address using the two variables n.
When the main function finishes the destructors of the two PInt's are called: The first one succeeds without issues, but the second one calls delete on memory that has already been deleted.