La norma establece que solo puede eliminar lo que asignó con nuevo, pero eso no explica por qué se bloquea, o en este caso, no se bloquea.
Cuando elimina un puntero, lo está volviendo a colocar en el montón para usarlo nuevamente en futuras asignaciones. La implementación típica le da un puntero, con un int justo antes de que su puntero rastree la memoria en el bloque (esa es la implementación típica de malloc). Así, para un sistema típico de 32 bits.
p-4 size here
p--> +--------+
| your |
| block |
Así que si apunta hacia el centro de la manzana, que va a interpretar los bytes justo antes de que como tamaño, con resultados potencialmente desastrosos. Fuiste salvado de ver el bloqueo por tu pequeño ejemplo de código. Probablemente, nunca trataste de asignar después de ese punto. Si tratas de asignar algo después de eso, probablemente se bloqueará, porque tratará de reciclar parte de la memoria que acabas de devolver.
La razón exacta obviamente depende de la implementación. Esto es sólo para explicar una forma común eliminaciones inadecuadas pueden fallar, no ha sido verificada específicamente para Visual Studio 2005.
"parece estar funcionando bien" - sí, pero * ¿es *? : P – Marlon
Esto bombardeará su programa muy bien en Vista y Win7. Es hora de deshacerse de XP. –
@Marlon: ¿no es esa mi pregunta? – sje397