1 - no, non è un errore che il compilatore ti evidenzi. Hai semplicemente perso la memoria allocata con p_x=new int(20), e non hai più la possibilità di rilasciarla poichè non puoi più risalire al suo indirizzo.
2 - delete p_x a questo punto è completamente sbagliato perchè stai rilasciando una memoria che non hai allocato dinamicamente. Quello che era però contenuto in quella casella di memoria non è tuttavia toccato e rimane quello che era prima e penso che nessuno lo modificherà più perchè non fa parte della memoria dinamica. Hai semplicemente pasticciato.
3 - new int (0); non ho idea di cosa può fare il compilatore con una simile richiesta, ma è sbagliato e non mi meraviglia che quando cerchi di risasciare una memoria non allocata ti vada in errore di runtime
ciao
sergio