Tudo bem, acho que todos concordamos que o que acontece com o código a seguir é indefinido, dependendo do que foi passado,
void deleteForMe(int* pointer)
{
delete[] pointer;
}
O ponteiro pode ter todos os tipos de coisas diferentes e, portanto, executar um incondicional delete[]
nele é indefinido. 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 é que sabe disso? Quero dizer, do ponto de vista da linguagem / compilador, não tem idéia se é ou não arr
um ponteiro de matriz versus um ponteiro para um único int. Caramba, ele nem sabe se arr
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 com algum tipo de 'matança', excluindo o restante da memória além desse ponto (em contraste com isso com strlen
uma \0
string não terminada - ele continuará até atinge 0).
Então, de quem é o trabalho para lembrar dessas 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 de 'matança' não acontece, portanto, no mundo prático, alguém está se lembrando.)