web-dev-qa-db-fra.com

La mémoire perdue est-elle libérée à la fin du programme?

Si j'ai programmé - sans le savoir - une fuite de mémoire et que l'application se termine, la mémoire perdue est-elle libérée?

94

Oui, une "fuite de mémoire" est simplement une mémoire à laquelle un processus n'a plus de référence et ne peut donc plus être libérée. Le système d'exploitation garde toujours une trace de toute la mémoire allouée à un processus et la libérera à la fin de ce processus.

Dans la grande majorité des cas, le système d'exploitation libérera la mémoire - comme c'est le cas avec les "saveurs" normales de Windows, Linux, Solaris, etc. Cependant, il est important de noter que dans des environnements spécialisés tels que divers systèmes d'exploitation en temps réel, le la mémoire ne peut pas être libérée à la fin du programme.

123
Justin Ethier

Le système d'exploitation exécutant votre programme effectue généralement le nettoyage de la mémoire qui n'est pas libérée explicitement et gère les éléments qui ne sont pas fermés explicitement, mais cela n'est pas garanti par la norme C++. Vous pouvez trouver des appareils intégrés qui ne libèrent pas vos fuites de mémoire.

Cela étant dit, Windows et toutes les distributions de Linux que j'ai jamais vues libèrent des fuites de mémoire.

Vous pouvez facilement créer une énorme boucle de fuites de mémoire pour le tester vous-même. Regardez votre utilisation de RAM augmenter, puis fermez votre programme. Vous verrez que l'utilisation de RAM diminue).


Une autre considération lors de l'utilisation de C++ est que si vous ne supprimez pas votre mémoire allouée au tas, vos destructeurs ne sont également pas appelés. Parfois, vous aurez également d'autres effets secondaires si vos destructeurs ne sont pas appelés.

30
Brian R. Bondy

Utilisez-vous un système d'exploitation de bureau (Windows, Linux, etc.)? Si c'est le cas, oui, en général, le système libère toute mémoire associée au programme lorsque le programme se termine.

13
Vicky

D'habitude, oui. Cependant, certains systèmes prennent en charge des éléments tels que les blocs de mémoire partagée qui ne sont pas automatiquement libérés à la fermeture d'un programme. La plupart conservent toujours un nombre de références et le suppriment lorsque tous les programmes qui l'ont ouvert se terminent, mais quelques-uns ne le font pas (par exemple, Windows 16 bits avait quelques types d'éléments qui resteraient alloués même lorsque rien n'y faisait référence - bien que il s'est généralement écrasé pour d'autres raisons avant que cela ne s'accumule pour causer un problème ...)

9
Jerry Coffin

Cela dépend de la mémoire que vous avez perdue. Une partie de la mémoire ne peut pas être récupérée par le système d'exploitation. Cependant, la plupart de la mémoire sur la plupart des systèmes d'exploitation sera automatiquement récupérée à la fin du processus.

3
Puppy

Pour autant que je sache, un système d'exploitation moderne libérera cette mémoire une fois le programme terminé.

3
ravibhagw