Como excluir [] sabe que é uma matriz?

Tudo bem, acho que todos concordamos que o que acontece com o código a seguir é indefinido, dependendo do que é passado,

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

O ponteiro pode ter todos os tipos de coisas diferentes e, assim, executar um @ incondiciondelete[] não está definido. No entanto, vamos supor que estamos realmente passando um ponteiro de matriz,

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

Minha pergunta é, neste caso, onde o ponteiro uma matriz, quem sabe isso? Quero dizer, do ponto de vista do idioma / compilador, não faz ideia searr é um ponteiro de matriz versus um ponteiro para um único int. Caramba, ele nem sabe searr foi criado dinamicamente. No entanto, se eu fizer o seguinte,

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

O sistema operacional é inteligente o suficiente para excluir apenas um int e não continuar em algum tipo de 'matança', excluindo o restante da memória além desse ponto (em contraste comstrlen e um não\0 -terminated string - continuará até atingir 0

Então, de quem é esse trabalho para lembrar essas coisas? O sistema operacional mantém algum tipo de registro em segundo plano? (Quero dizer, eu percebi que comecei este post dizendo que o que acontece é indefinido, mas o fato é que o cenário 'matança' não acontece, portanto, no mundo práticoalgué está lembrando.)

questionAnswers(16)

yourAnswerToTheQuestion