C'est quelque chose qui me dérange depuis des lustres maintenant.
On nous enseigne tous à l'école (du moins, je l'étais) que vous DEVEZ libérer chaque pointeur qui est alloué. Je suis un peu curieux, cependant, au sujet du coût réel de ne pas libérer de mémoire. Dans certains cas évidents, comme quand malloc
est appelé à l'intérieur d'une boucle ou d'une partie d'une exécution de thread, il est très important de le libérer afin qu'il n'y ait pas de fuite de mémoire. Mais considérons les deux exemples suivants:
Tout d'abord, si j'ai du code, c'est quelque chose comme ceci:
int main()
{
char *a = malloc(1024);
/* Do some arbitrary stuff with 'a' (no alloc functions) */
return 0;
}
Quel est le vrai résultat ici? Je pense que le processus meurt et que l'espace de mémoire a disparu de toute façon, donc il n'y a aucun mal à manquer l'appel à free
(cependant, je reconnais l'importance de l'avoir quand même pour la fermeture, la maintenabilité et les bonnes pratiques). Ai-je raison dans cette pensée?
Deuxièmement, disons que j'ai un programme qui agit un peu comme un shell. Les utilisateurs peuvent déclarer des variables comme aaa = 123
et celles-ci sont stockées dans une structure de données dynamique pour une utilisation ultérieure. De toute évidence, il semble évident que vous utiliseriez une solution qui appellera une fonction * alloc (hashmap, liste liée, quelque chose comme ça). Pour ce type de programme, cela n'a aucun sens de ne jamais être libéré après l'appel malloc
car ces variables doivent être présentes à tout moment pendant l'exécution du programme et il n'y a pas de bon moyen (que je puisse voir) pour implémenter cela avec de l'espace alloué statiquement. Est-ce une mauvaise conception d'avoir un tas de mémoire allouée mais libérée uniquement dans le cadre de la fin du processus? Si oui, quelle est l'alternative?
free(a)
cela ne fait vraiment rien pour libérer de la mémoire! Il réinitialise simplement certains pointeurs dans l'implémentation libc de malloc qui gardent une trace des morceaux de mémoire disponibles dans une grande page de mémoire mappée (communément appelée le "tas"). Cette page ne sera toujours libérée qu'à la fin de votre programme, pas avant.