La plupart des implémentations ne vous embêtez pas à l'identification de ceux (assez rares) cas où l'intégralité de "blocs" (quelque soit la taille convient à l'OS) ont été libérés et pourrait être retournés, mais il y a bien sûr des exceptions. Pour exemple, je cite la page de wikipedia, dans OpenBSD:
Sur un appel à l' free
, la mémoire est libérée
et non mappés à partir du processus d'adresse
l'espace à l'aide de munmap. Ce système est
conçu pour améliorer la sécurité
l'avantage du format d'espace d'adresse
la randomisation et de l'écart de fonctions de la page
mis en œuvre dans le cadre d'OpenBSD mmap
appel système et détecter les
use-after-free bugs-comme une grande mémoire
l'allocation est complètement déchargés de la mémoire
après il est libéré, la poursuite de l'utilisation des causes
une erreur de segmentation et de résiliation
de le programme.
La plupart des systèmes ne sont pas aussi centré sur la sécurité que OpenBSD, cependant.
Sachant cela, quand je suis le codage d'un long-système en cours d'exécution qui a connu-à-être transitoire une exigence pour une grande quantité de mémoire, j'essaie toujours d' fork
le processus: le parent alors juste attend les résultats de l'enfant [[généralement sur un tuyau]], l'enfant fait le calcul (y compris l'allocation de mémoire), renvoie les résultats [[on dit pipe]], puis se termine. De cette manière, mon long processus en cours d'exécution ne sera pas inutilement accaparer la mémoire pendant le long temps entre occasionnels "pointes" dans sa demande de mémoire. D'autres stratégies alternatives incluent le passage à une coutume allocateur de mémoire pour des exigences spéciales (C++ en fait assez facile, bien que les langues avec virtual machines à sous telles que Java et Python n'est généralement pas).