Pourquoi cela fonctionne-t-il?utilisant la mémoire non allouée sans erreur?
#include <iostream>
using namespace std;
int main() {
float* tab[3];
int i = 0;
while(i < 3) {
tab[i] = new float[3-i];
i++;
}
cout << tab[2][7] << endl;
tab[2][7] = 6.87;
cout << tab[2][7] << endl;
i = 0;
while(i < 3)
delete[] tab[i];
}
alors que celui-ci ne le fait pas? J'ai essayé les deux programmes sur Win XP avec MS VS 2008, tous deux compilés sans erreur et le premier fonctionnait sans aucune erreur. La seconde fait apparaître une fenêtre d'erreur, mais je ne m'en souviens pas et je ne peux pas la reproduire (pas d'accès à Windows pour le moment).
Je les ai essayés aussi sur Linux (Kubuntu 10.10 avec le paquet de noyau précompilé version 2.6.35.23.25) avec g ++ et les deux compiler et exécuter sans erreurs.
Pourquoi? Ne devrait-il pas y avoir des fenêtres pop-up avec quelque chose comme "Mauvais accès à la mémoire non allouée"?
Je sais qu'il devrait (et, heureusement, compile) sans erreurs, mais je pensais qu'il ne devrait pas fonctionner sans eux ... Et pourquoi le deuxième exemple fait des erreurs sur Windows et pas sur Linux?
Même alors, std :: vector limite uniquement les vérifications dans les versions de débogage (heureusement!) –
Sauf si vous utilisez 'vector :: at()' ou travaillez avec des itérateurs plutôt qu'avec des index. – Eclipse
En fait, celui-ci est un peu trop mal aussi. Tout d'abord, il n'y a pas de «pages» dans la norme et toutes les implémentations ne fonctionneront pas comme vous le prétendez à cet égard. En second lieu, vous pouvez seulement remplacer la pile (sur les systèmes qui en utilisent même une) lorsque le tableau est situé dessus. La mémoire allouée par le magasin libre n'est pas dans la pile. Le type d'attaque dont vous parlez se produit lorsque vous faites quelque chose comme 'void f() {char buf [SZ]; obtient (buf); } ', ce qui n'est pas le problème du PO. –