Il y a deux endroits où les variables peuvent être mis en mémoire. Lorsque vous créez une variable comme ceci:
int a;
char c;
char d[16];
Les variables sont créées dans la "pile". Pile les variables sont automatiquement libérés quand ils sortent de la portée (c'est à dire lorsque le code ne peut pas les atteindre plus). Vous entendrez peut-être appelé "automatique" des variables, mais qui est tombé de la mode.
Beaucoup de débutant exemples utilisent uniquement des variables de pile.
La pile est sympa parce que c'est automatique, mais il a aussi deux inconvénients: (1) Le compilateur a besoin de savoir à l'avance comment les grandes variables, et (b) l'espace de pile est quelque peu limitée. Par exemple: dans Windows, sous paramètres par défaut de l'éditeur de liens Microsoft, la pile est de 1 MO, et pas tous, il est disponible pour les 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 de "plan B".
Le Plan B est appelé le "tas". Habituellement, vous pouvez créer des variables aussi grande que le Système d'Exploitation permettra de vous, mais vous devez le faire vous-même. Plus tôt offres vous a montré d'une façon que vous pouvez le faire, bien qu'il existe d'autres moyens:
int size;
// ...
// Set size to some value, based on information available at run-time. Then:
// ...
char *p = (char *)malloc(size);
(Notez que les variables dans le tas ne sont pas manipulés directement, mais par l'intermédiaire de pointeurs)
Une fois que vous créez un tas de variable, le problème est que le compilateur ne peut pas dire quand vous avez fini avec elle, de sorte que vous perdez de l'automatique, de la relâcher. C'est là que le "manuel de libérer" vous faisiez référence à vient en. Votre code est maintenant responsable pour décider quand la variable n'est plus nécessaire, et libérer ainsi de la mémoire peut être pris à d'autres fins. Pour le cas ci-dessus, avec:
free(p);
Ce qui rend cette deuxième option "sale affaire", c'est qu'il n'est pas toujours facile de savoir quand la variable n'est plus nécessaire. Oublier de libérer une variable lorsque vous n'en avez pas besoin, il sera la cause de votre programme à consommer plus de mémoire qu'il doit. Cette situation est appelée une "fuite". La "fuite" de la mémoire ne peut pas être utilisé pour quoi que ce soit jusqu'à la fin de votre programme et de l'OS récupère la totalité de ses ressources. Même les plus méchants problèmes sont possibles si vous relâchez un tas de variable par erreur avant de vous sont effectivement fait avec elle.
En C et C++, vous êtes responsable pour le nettoyage de votre tas de variables comme indiqué ci-dessus. Cependant, il y a des langues et environnements, tels que Java et .NET langages tels que C# qui utilisent une approche différente, où le tas devient nettoyé sur son propre. Cette seconde méthode, appelée "garbage collection", est beaucoup plus facile sur le développeur, mais vous devez payer une pénalité dans les frais généraux et de la performance. C'est un équilibre.
(J'ai passe beaucoup de détails à donner une plus simple, mais je l'espère plus nivelé réponse)