Envoyé par
jblecanard
Pour un tableau dont la taille est connue à la compilation, on utilise:
1 2 3
| T* tab = new T[taille];
//...
delete[] tab; |
Ou mieux, en C++11:
1 2 3
| std::array<T, taille> * tab = new std::array<T, taille>;
//...
delete tab; |
Ou, si la taille est connue à la compilation, tout simplement
std::array<T, taille> tab;
Sauf cas particulier, le new/delete ici n'apporte rien.
Envoyé par
jblecanard
Si la taille n'est pas connue à la compilation mais à l'exécution, ou si le tableau est amené à changer de taille, il te faut utilise std::vector. En C++14, on aura std::dynarray pour les tableaux dont la taille ne change pas une fois qu'il est créé.
Ou new[], même si effectivement std::vector est la plupart du temps très largement préférable.
Envoyé par
jblecanard
Attention au piège:
1 2 3 4 5
| size_t taille = 0;
std::cin >> taille;
T* tab = new T[taille];
//...
delete[] tab; |
C'est un exemple ou la taille est connue à l'exécution uniquement. Ce code compile (et fonctionne) avec GCC, mais c'est une extension de GCC,
ce n'est pas standard. A éviter au possible. Il se peut que Visual Studio accepte aussi ce code, mais clang le refuse, à juste titre.
Ce code compile et fonctionne car il est correct (c'est le rôle de new[]. Je pense que tu confonds avec les "VLAs", c'est à dire des tableaux statiques dont la taille n'est connue qu'à l’exécution soit :
1 2 3
| size_t taille = 0;
std::cin >> taille;
T tab[taille]; |
Mais je suis d'accord que c'est à éviter et qu'il faut privilégier std::vector, std::array et autre conteneur RAIIsant.
Partager