Ceci est une ancienne révision du document !
Au sein d'une application, la mémoire disponible est découpée en deux grandes zones :
La pile est une zone mémoire gérée automatiquement par le compilateur. C'est la zone par défaut d'allocation des variables. Celle ci est souvent limitée en taille (quelques méga-octets sur les systèmes modernes). Elle est aussi utilisée en particulier pour empiler les arguments d'une fonction lors de son appel(d'où son nom).
A l'inverse, l'utilisation du tas doit être faite explicitement par le programmeur par l'utilisation de l'allocation dynamique. Cette zone est virtuellement illimitée : tant qu'il y a de la mémoire de libre, on peut créer des objets dedans.
Au moment de la création d'une variable, le compilateur va automatiquement réserver de la mémoire dans la pile pour cette dernière. La pile n'ayant pas une taille infinie, il est important qu'il puisse libérer cette mémoire le plus tôt possible. Il peut le faire à partir du moment où le flux d’exécution sort du bloc où la variable a été déclarée. La destruction des variables allouées sur la pile se fera dans l'ordre inverse de leur déclaration.
Dans l'exemple ci dessous, le flux d'exécution commence à main. La première accolade ouvrante déclare un nouveau bloc qui se termine à l'accolade fermante correspondante 5 lignes plus bas. La première instruction de ce bloc est la création d'une variable a. Le flux d'exécution rentre alors dans un nouveau bloc, qui se termine 3 lignes plus bas. Dans ce bloc, on va créer les variables b et c avant d'en sortir. Au moment de la sortie du bloc, c puis b. Le flux rencontre ensuite la fin du premier bloc, où il va procéder alors à la destruction de a.
int main() { int a { 132 }; { int b { 456 }; int c = b + a; } // destruction de c puis b }
explication de la différence ? Intéret pratique ? Si on n'a pas encore vu les fonctions
bloc {}