Maldición, me perdí todo el sentido de la pregunta, pero Dejaré mi respuesta original como nota al margen. La razón por la que tenemos delete [] es porque hace mucho tiempo teníamos delete [cnt], incluso hoy si escribes delete [9] o delete [cnt], el compilador simplemente ignora la cosa entre [] pero compila ok. En ese momento, C++ fue procesado por un front-end y luego alimentado a un compilador de C ordinario. No podían hacer el truco de almacenar el conteo en algún lugar debajo de la cortina, tal vez ni siquiera podían pensar en eso en ese momento.Y para compatibilidad con versiones anteriores, los compiladores probablemente usaron el valor dado entre [] como el recuento de matriz, si no hay tal valor, obtuvieron el recuento del prefijo, por lo que funcionó en ambos sentidos. Más tarde, no escribimos nada entre [] y todo funcionó. Hoy, no creo que sea necesario "eliminar []", pero las implementaciones así lo exigen.
Mi respuesta original (que pierde el punto) ::
"Borrar" elimina un único objeto. "delete []" borra una matriz de objetos. Para que delete [] funcione, la implementación mantiene la cantidad de elementos en la matriz. Acabo de verificar esto al depurar el código ASM. En la implementación (VS2005) que probé, el recuento se almacenó como un prefijo para la matriz de objetos.
Si utiliza "eliminar []" en un solo objeto, la variable de conteo es basura por lo que el código falla. Si usa "eliminar" para una matriz de objetos, debido a alguna incoherencia, el código falla. ¡Probé estos casos justo ahora!
"eliminar simplemente borra la memoria asignada para la matriz". declaración en otra respuesta no es correcta. Si el objeto es una clase, delete llamará al DTOR. Simplemente coloque un punto de corte en el código DTOR y elimine el objeto, el punto de interrupción se activará.
Lo que se me ocurrió es que si las compilaciones & supusieron que todos los objetos asignados por "nuevo" son matrices de objetos, sería correcto llamar a "eliminar" para objetos individuales o matrices de objetos. objetos individuales simplemente sería el caso especial de una matriz de objetos que tiene un recuento de 1. Tal vez hay algo que me falta, de todos modos ...
Actualmente, cuando usa la nueva int [1], almacena en el encabezado de la matriz antes de que aparezcan los primeros datos, el tamaño de la misma. Por lo tanto, usar delete en lugar de delete [] no liberará esa parte de la memoria. – Rodrigo