Bon, je pense que nous sommes tous d'accord 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 d'effectuer un inconditionnel delete[]
sur il n'est pas défini. Cependant, supposons que nous sommes, en effet, le passage d'un tableau de pointeur,
int main()
{
int* arr = new int[5];
deleteForMe(arr);
return 0;
}
Ma question est, dans ce cas où le pointeur est un tableau, qui est-ce qui sait? Je veux dire, de la langue/du compilateur point de vue, il n'a aucune idée de savoir si ou non arr
est un tableau de pointeur par rapport à un pointeur vers un seul int. Heck, il ne sait même pas si arr
a été créé de façon dynamique. Pourtant, si je ne les suivants au lieu de cela,
int main()
{
int* num = new int(2);
deleteForMe(num);
return 0;
}
L'OS est assez intelligent pour ne supprimez un int et ne pas aller sur un certain type de "tuerie" en supprimant le reste de la mémoire au-delà de ce point (contrairement à strlen
et un non-\0
chaîne terminée -- il va continuer jusqu'à ce qu'il arrive à 0).
Donc dont le travail est-il un souvenir de ces choses? L'OS de garder un certain type de l'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, la "tuerie" scénario ne se produise pas, donc, par conséquent, dans la pratique , quelqu'un s'en rappelle.)