RE:Que ocurre si hago un delete sin new
Yo te cuento lo que pasa en unix
Si haces delete de un puntero que apunta a null, no pasa nada.
Si haces delete de un puntero que no es null, pero que tampoco has hecho new, no casca ni dice nada en el momento, pero corrompe al gestor de memoria dinamica de tu proceso y el programa puede cascar mas adelante, en cualquier sitio (generalmente en otro new o delete).
Si haces dos veces delete de la misma zona de memoria, aunque sea con punteros distintos, pasa lo mismo.
Como consejo, cuando declares un puntero inicializalo siempre a null. Asegurate de hacer un delete por cada new y solo uno. Cuando hagas el delete pon algo asi como
if (p != NULL)
{
delete p;
p = NULL;
}
De esta forma evitas problemas y solo tienes que tener cuidado de no hacer delete de dos punteros distintos que apunten a la misma zona de memoria (con lo que liberarias dicha zona dos veces, la primera bien, y la segunda provoca corrupción).
Si tienes problemas en algun momento con este tema, echa un ojo a mi pagina web, en la parte de trucos cpp. Hay una cosa sencillita que te puede ayudar a encontrar deletes incorrectos.
Se bueno.