Sans entrer ici dans les détails d'une implémentation spécifique, la raison intuitive derrière le crash peut être expliquée simplement en considérant ce que les delete[]
est censé faire :
Détruit un tableau créé par un new[]
-expression
Vous donnez delete[]
un pointeur vers un tableau. Entre autres choses, il doit libérer la mémoire qu'il a allouée pour contenir le contenu de ce tableau après.
Comment l'allocateur sait-il ce qu'il doit libérer ? Il utilise le pointeur que vous lui avez donné comme clé pour rechercher la structure de données qui contient les informations comptables pour le bloc alloué. Quelque part, il existe une structure qui stocke la correspondance entre les pointeurs vers les blocs précédemment alloués et l'opération comptable associée.
Vous pouvez souhaiter que cette recherche donne lieu à une sorte de message d'erreur convivial si le pointeur que vous passez à delete []
n'était pas celui renvoyé par un new[]
mais rien dans la norme ne le garantit.
Ainsi, il est possible, étant donné un pointeur qui n'avait pas été précédemment alloué par new[]
, delete[]
se retrouve à regarder quelque chose qui n'est pas vraiment une structure comptable cohérente. Les fils se croisent. Un accident s'ensuit.
Ou, vous pourriez souhaiter que delete[]
dirait "hé, il semble que ce pointeur pointe vers un endroit à l'intérieur d'une région que j'ai allouée auparavant. Laissez-moi revenir en arrière et trouver le pointeur que j'ai renvoyé lorsque j'ai alloué cette région et l'utiliser pour rechercher les informations comptables" mais, encore une fois, il n'y a aucune exigence de ce type dans la norme :
Pour la deuxième forme (tableau), l'expression doit être une valeur de pointeur nulle ou une valeur de pointeur précédemment obtenue par une forme tableau de new-expression. Si l'expression est toute autre chose y compris si c'est un pointeur obtenu par la forme non-array de new-expression, le comportement est indéfini . [souligné par moi]
Dans ce cas, vous avez de la chance car vous avez découvert instantanément que vous aviez fait quelque chose de mal.
PS : Il s'agit d'une explication à la main