Beaucoup de gens semblent être sous l'impression qu'une fois que vous libérer de la mémoire, il est immédiatement renvoyé au système d'exploitation et peut être utilisé par d'autres programmes.
Ce n'est pas vrai. Les systèmes d'exploitation couramment gérer la mémoire dans 4KiB pages. malloc
, et d'autres sortes de la gestion de la mémoire d'obtenir des pages de l'OS et de la sous-gérer comme ils l'entendent. Il est fort probable qu' free()
va pas retourner les pages vers le système d'exploitation, sous l'hypothèse que votre programme va malloc plus de mémoire plus tard.
Je ne dis pas qu' free()
ne retourne jamais de la mémoire pour le système d'exploitation. Il peut arriver, surtout si vous êtes en libérant de grandes étendues de mémoire. Mais il n'y a aucune garantie.
Le fait important: Si vous n'avez pas de mémoire libre que vous n'avez plus besoin, d'autres mallocs sont garantis à consommer encore plus de mémoire. Mais si vous libérez d'abord, malloc peut ré-utiliser la mémoire libérée à la place.
Qu'est-ce que cela signifie dans la pratique? Cela signifie que si vous savez que votre programme n'est pas va nécessiter plus de mémoire à partir de maintenant (par exemple, il est dans la phase de nettoyage), la libération de la mémoire n'est pas si important. Cependant, si le programme peut allouer plus de mémoire, plus tard, vous devriez éviter les fuites de mémoire - en particulier celles qui peuvent se produire à plusieurs reprises.
Voir également de ce commentaire pour plus de détails sur le pourquoi de la libération de la mémoire juste avant la résiliation est mauvais.
Un intervenant n'a pas l'air de comprendre que l'appelant free()
ne met pas automatiquement à permettre à d'autres programmes de l'utilisation de la mémoire libérée. Mais c'est le but de cette réponse!
Donc, pour convaincre les gens, je vais vous montrer un exemple où free() ne fait que très peu de bien. Pour faire le calcul est facile à suivre, je vais faire semblant que le système d'exploitation gère la mémoire de 4000 octets pages.
Supposons que vous allouer de dix mille (100 octets blocs (pour des raisons de simplicité, je vais ignorer la mémoire supplémentaire qui serait nécessaire pour gérer ces allocations). Ce qui consomme de 1 MO, ou de 250 pages. Si vous puis gratuit 9000 de ces blocs au hasard, vous êtes de gauche avec juste 1000 blocs - mais ils sont dispersés un peu partout. Statistiquement, environ 5 des pages sera vide. Les autres 245 auront chacune au moins un bloc alloué. Ce qui revient à 980KB de mémoire, cela ne peut pas être récupérée par le système d'exploitation, même si désormais vous n'100KB affectés!
D'autre part, vous pouvez maintenant malloc() 9000 blocs de plus sans augmenter la quantité de mémoire de votre programme est attachant.
Même lorsqu' free()
pourrait techniquement retour de la mémoire à l'OS, il ne peut pas le faire. free()
des besoins de parvenir à un équilibre entre exploitation rapidement et d'économiser la mémoire. Et d'ailleurs, un programme qui a déjà alloué beaucoup de mémoire, puis libéré, il est susceptible de le faire à nouveau. Un serveur web a besoin de gérer la demande après demande après demande - il est logique de garder du "mou" de la mémoire disponible de sorte que vous n'avez pas besoin de demander au système d'exploitation pour la mémoire de tous les temps.