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.)