¿Cómo sabe eliminar [] que es una matriz?

De acuerdo, creo que todos estamos de acuerdo en que lo que sucede con el siguiente código no está definido, dependiendo de lo que se pase,

void deleteForMe(int* pointer)
{
     delete[] pointer;
}

l puntero podría ser todo tipo de cosas diferentes, y así realizar un incondicionaldelete[] está indefinido. Sin embargo, supongamos que de hecho estamos pasando un puntero de matriz,

int main()
{
     int* arr = new int[5];
     deleteForMe(arr);
     return 0;
}

Mi pregunta es, en este caso, donde el punteroe una matriz, ¿quién es el que sabe esto? Quiero decir, desde el punto de vista del lenguaje / compilador, no tiene idea de siarr es un puntero de matriz frente a un puntero a un único int. Diablos, ni siquiera sabe siarr fue creado dinámicamente. Sin embargo, si hago lo siguiente en su lugar,

int main()
{
     int* num = new int(1);
     deleteForMe(num);
     return 0;
}

El sistema operativo es lo suficientemente inteligente como para eliminar solo un int y no realizar algún tipo de 'matanza' eliminando el resto de la memoria más allá de ese punto (contraste que constrlen y un no-\0 cadena terminada: continuará hasta que llegue a 0).

Entonces, ¿de quién es el trabajo de recordar estas cosas? ¿El sistema operativo mantiene algún tipo de registro en segundo plano? (Quiero decir, me doy cuenta de que comencé esta publicación diciendo que lo que sucede no está definido, pero el hecho es que el escenario de la "ola de asesinatos" no ocurre, por lo tanto, en el mundo prácticoalguie está recordando.)

Respuestas a la pregunta(16)

Su respuesta a la pregunta