D'accord, je pense que nous sommes tous d'accord pour dire que ce qui se passe avec le code suivant n'est pas défini, en fonction de ce qui est passé,
void deleteForMe(int* pointer)
{
delete[] pointer;
}
Le pointeur peut être toutes sortes de choses différentes, et donc exécuter une inconditionnelle delete[]
dessus n'est pas défini. Cependant, supposons que nous passons effectivement un pointeur de tableau,
int main()
{
int* arr = new int[5];
deleteForMe(arr);
return 0;
}
Ma question est, dans ce cas où le pointeur est un tableau, qui le sait? Je veux dire, du point de vue du langage / compilateur, il n'a aucune idée si oui ou non arr
est un pointeur de tableau par rapport à un pointeur vers un seul int. Heck, il ne sait même pas s'il a arr
été créé dynamiquement. Pourtant, si je fais ce qui suit à la place,
int main()
{
int* num = new int(1);
deleteForMe(num);
return 0;
}
Le système d'exploitation est suffisamment intelligent pour ne supprimer qu'un seul int et ne pas se lancer dans un certain type de `` folie meurtrière '' en supprimant le reste de la mémoire au-delà de ce point (comparez cela avec strlen
et une \0
chaîne non terminée - il continuera jusqu'à ce qu'il atteint 0).
Alors, à qui revient-il de se souvenir de ces choses? Le système d'exploitation conserve-t-il un type d'enregistrement en arrière-plan? (Je veux dire, je me rends compte que j'ai commencé ce post en disant que ce qui se passe n'est pas défini, mais le fait est que le scénario de la `` folie meurtrière '' ne se produit pas, donc dans le monde pratique quelqu'un se souvient.)