delete can go wrong when you've already called delete on the memory that pointer is pointing to, or when the memory that pointer is pointing to wasn't allocated using new, or when you mismatch array new/delete with non-array new/delete.
It can also go wrong when someone has trashed the memory being pointed to such that the memory bookkeeping information has been destroyed.