Selon la norme C++ ([dcl.array])
Dans une déclaration TD où D est de la forme
D1 [-expression constante opt] attribut-spécificateur -seq opt
la taille d'un ar rayon doit être constant (ou non spécifié avec un initialiseur approprié). Cependant, certains développeurs de compilateurs ont choisi d'autoriser les tableaux à longueur variable (VLA) pour la commodité du programmeur, pour maintenir la capacité de compiler du code C en C++ (C a permis VLA depuis le standard C99), ou un but infâme nous pouvons seulement apprendre après avoir conquis le monde.
La meilleure solution conforme à la norme est use a std::vector
lorsque la taille de l'allocation ne peut pas être connue au moment de la compilation.
int n;
if (cin>>n) // don't allocate unless n is valid
{
vector<int> arr(n);
// use arr
}
Même si VLA est disponible, le vector
est encore une solution plus sûre. vector
est allouée à partir du stockage dynamique, souvent un magasin de données beaucoup plus important que le stockage automatique, et si l'allocation échoue, une exception est levée. Le comportement d'un tableau de longueur variable trop grand pour le stockage est souvent indéfini et déborde probablement la pile (une forme courante de stockage automatique), ce qui entraîne la multiplication des bogues mystérieux.
L'allocation de mémoire brute avec new
devrait être évitée car elle prend en charge la gestion supplémentaire (elle doit être supprimée manuellement à un moment donné avec delete[]
) et la comptabilité (la taille de l'allocation est inconnue au pointeur) responsabilités. Le programmeur peut aussi avoir maintenant besoin d'adresser The Rules of Three and Five.
Les VLA ne sont pas conformes aux normes C++! Ce dont vous avez réellement besoin est 'std :: vector arr (n);'. –
user0042