Il y a deux endroits où les variables peuvent être mises en mémoire. Lorsque vous créez une variable comme celle-ci:
int a;
char c;
char d[16];
Les variables sont créées dans la " pile ". Les variables de pile sont automatiquement libérées lorsqu'elles sont hors de portée (c'est-à-dire lorsque le code ne peut plus les atteindre). Vous pourriez les entendre appelées variables "automatiques", mais cela n'est plus à la mode.
De nombreux exemples pour débutants n'utiliseront que des variables de pile.
La pile est agréable parce qu'elle est automatique, mais elle a aussi deux inconvénients: (1) Le compilateur doit savoir à l'avance la taille des variables, et (b) l'espace de pile est quelque peu limité. Par exemple: dans Windows, sous les paramètres par défaut de l'éditeur de liens Microsoft, la pile est définie sur 1 Mo et elle n'est pas entièrement disponible pour vos variables.
Si vous ne savez pas au moment de la compilation la taille de votre tableau, ou si vous avez besoin d'un grand tableau ou structure, vous avez besoin du "plan B".
Le plan B est appelé le « tas ». Vous pouvez généralement créer des variables aussi grandes que le système d'exploitation vous le permet, mais vous devez le faire vous-même. Les publications précédentes vous ont montré une façon de le faire, bien qu'il existe d'autres façons:
int size;
// ...
// Set size to some value, based on information available at run-time. Then:
// ...
char *p = (char *)malloc(size);
(Notez que les variables du tas ne sont pas manipulées directement, mais via des pointeurs)
Une fois que vous avez créé une variable de tas, le problème est que le compilateur ne peut pas dire quand vous en avez terminé, vous perdez donc la libération automatique. C'est là qu'intervient la "libération manuelle" dont vous parliez. Votre code est maintenant responsable de décider quand la variable n'est plus nécessaire, et de la libérer pour que la mémoire puisse être utilisée à d'autres fins. Pour le cas ci-dessus, avec:
free(p);
Ce qui rend cette deuxième option "mauvaise affaire", c'est qu'il n'est pas toujours facile de savoir quand la variable n'est plus nécessaire. Si vous oubliez de publier une variable lorsque vous n'en avez pas besoin, votre programme consommera plus de mémoire dont il a besoin. Cette situation s'appelle une «fuite». La mémoire «perdue» ne peut pas être utilisée pour quoi que ce soit jusqu'à ce que votre programme se termine et que le système d'exploitation récupère toutes ses ressources. Des problèmes encore plus désagréables sont possibles si vous libérez une variable de tas par erreur avant d'en avoir fini avec elle.
En C et C ++, vous êtes responsable de nettoyer vos variables de tas comme indiqué ci-dessus. Cependant, il existe des langages et des environnements tels que Java et .NET comme C # qui utilisent une approche différente, où le tas est nettoyé tout seul. Cette deuxième méthode, appelée "garbage collection", est beaucoup plus facile pour le développeur mais vous payez une pénalité en frais généraux et en performances. C'est un équilibre.
(J'ai passé sous silence de nombreux détails pour donner une réponse plus simple, mais j'espère plus nivelée)