Muy bien, 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;
}
El puntero podría ser todo tipo de cosas diferentes, por lo que realizar un incondicional delete[]
en él no está definido. 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 puntero es una matriz, ¿quién es el que sabe esto? Quiero decir, desde el punto de vista del lenguaje / compilador, no tiene idea de si arr
es un puntero de matriz frente a un puntero a un solo int. Diablos, ni siquiera sabe si arr
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 ir a algún tipo de 'juerga asesina' eliminando el resto de la memoria más allá de ese punto (contraste eso con strlen
y una \0
cadena no terminada, continuará hasta que hits 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 que en el mundo práctico alguien está recordando).