Comportement intéressant avec un tableau alloué dynamicment

Donc, je travaille avec un tableau alloué dynamicment, et je l’ai configuré pour contenir 5 éléments, qui devraient donc être 0-4. J’ai créé une fonction pour la réserver si nécessaire, mais je voulais voir si je rencontrais le blocage du programme auquel je m’attendais lorsque j’ai assigné une valeur au tableau à [5]. Mais pas d’erreur, pas avant [6].

Voici mon code:

int* dynamic_arr; dynamic_arr = new int[5]; for(int i = 0; i <= 100; i++){ dynamic_arr[i] = i; used++; cout << dynamic_arr[i]<<endl; } 

Voici la sortie:

 0 //i[0] 1 //i[1] 2 //i[2] 3 //i[3] 4 //i[4] 5 //i[5] <-- should be out of range 

Après cela, il se bloque.

Pourquoi suis-je en mesure d’atsortingbuer une valeur à une partie du tableau qui est, eh bien, hors de scope faute de meilleur terme?

Merci

OpSrcFTW

EDIT: Appréciez les réponses les gars, merci. Je vais en lire plus avant de poster pour une réponse rapide la prochaine fois, désolé.

L’access au-delà de la fin d’un tableau produit un comportement indéfini. Cela ne provoque pas nécessairement un crash. Tout peut arriver.

Accéder au tableau au-delà de ses limites est un comportement indéfini. Tout peut arriver, il n’est pas nécessaire qu’il soit reproductible et il est inutile d’essayer de “comprendre” tous les schémas que vous pensez pouvoir exister.

Accéder au-delà de la taille du tableau produira un comportement indéfini. Un comportement non défini inclut des événements tels que le blocage de votre code, son fonctionnement parfait, le fonctionnement sur un ordinateur et non un autre, le redémarrage de votre ordinateur ou la destruction de l’univers entier.

Comme d’autres l’ont déjà fait remarquer, votre comportement est indéfini. Ainsi, même si un blocage est possible, le code peut également sembler fonctionner.

Dans un cas comme le vôtre, le fait de paraître fonctionner lorsque vous accédez un peu au- delà de la fin de la mémoire allouée est assez courant. Le code qui gère la mémoire du magasin gratuit arrondira souvent la taille de votre demande à la taille supplémentaire qui vous semblera commode, telle qu’une puissance de deux. En tant que tel, il n’est pas particulièrement rare d’avoir au moins un peu de mémoire après la fin de ce que vous avez demandé de pouvoir écrire sans problèmes apparents .

Bien sûr, vous ne pouvez pas compter sur cela – pas même avec le même compilateur utilisant les mêmes indicateurs, etc. Tout simplement, la bibliothèque standard pourrait décider comment agir en fonction de la quantité de mémoire disponible sur la machine cible, en utilisant plus de rembourrage pour optimiser la vitesse lorsque la quantité de RAM disponible est importante, et moins de rembourrage pour réduire l’utilisation de la mémoire lorsqu’il y en a moins.

En tant que tel, non, vous ne pouvez pas compter sur un crash à un moment donné – mais ce n’est pas non plus un endroit où vous pouvez vous en tirer avec des tests ou en pensant que c’est quelque chose dont vous devez vous soucier uniquement si vous allez porter le code.