1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
|
{
// tableau statique
char array[50]; // Alloue 50 char dans la pile
} // Le tableau est entièrement détruit en sortant de la portée.
// C'est possible car le compilateur connait la taille du tableau à la compilation
{
int size;
cin >> size;
// char array[size]; // erreur, la taille doit être connue à la compilation
}
{
int size;
cin >> size;
// tableau dynamique
char* array = new char[size] // ok, on réserve un bloc de mémoire dans le tas de taille size.
//Personne ne peut plus écrire dedans sauf en utilisant le pointeur.
delete[] array; // on libère la mémoire.
// A partir de maintenant le sytème considère que le bloc est disponible à nouveau.
} // le pointeur array est détruit en sortant de la portée
{
int size;
cin >> size;
char* array = new char[size];
} /* vlan fuite mémoire.
Le bloc de mémoire alloué dans le tas n'a pas été libéré
et le pointeur n'est plus accessible car détruit en sortant de la portée.
Le bloc sera locké jusqu'à la fin du programme. */
{
int size;
cin >> size;
std::shared_ptr<char> array(new char[size]); // smart pointer.
// De plus en plus souvent disponible sur les compilateurs récents.
} // pas de fuite mémoire. En sortant de la portée le shared_ptr
// est détruit et désalloue automatiquement la mémoire à notre place. |