Un puntero apunta a una única dirección de memoria, en tu caso con el primer new has reservado espacio para una clase X y la has creado con el constructor por defecto, has liberado ese espacio, nas vuelto a reservar y crear la clase X con el constructor por defecto y has vuelto a liberar ese espacio. El
delete es necesario para que no se produzca una fuga de memoria en ese caso.
Para conseguir lo que tu quieres has de utilizar la variación de new/ delete con []
Código C++:
Ver originalint main(int argc, char* args[])
{
X *p;
p = new X[2]; // Cogemos y creamos dos clases X memorias en contigua
p[0].n = 3; // p[0] == *p es la primera clase X
p[1].n = 4; // p[1] == *(p + 1) es la segunda clase X que hemos creado
delete[] p; // Para realizar delete utilizamos la variación con []
return 0;
}