Une fuite de mémoire est-elle libérée lorsque le programme se termine?

Réponses:

151

Oui, une «fuite de mémoire» est simplement de la mémoire à laquelle un processus n'a plus de référence et ne peut donc plus libérer. Le système d'exploitation garde toujours une trace de toute la mémoire allouée à un processus et la libère lorsque ce processus se termine.

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 la mémoire peut ne pas être libérée lorsque le programme est terminé.

Justin Ethier
la source
4
Question: Le système d'exploitation garde-t-il une trace de toutes les allocations? Toute mémoire de tas que vous allouez provient de l'espace mémoire virtuelle du processus - lorsque le processus se termine, cet espace est rendu au système en gros, n'est-ce pas? Je ne vois pas pourquoi la comptabilité supplémentaire serait nécessaire, car le processus de répartition des allocations est le seul processus (dans la zone utilisateur) ayant de toute façon accès à ces pages. Ou ai-je été mal enseigné?
Chris Tonkinson
6
@Justin: Sans connaître le système d'exploitation, je ne pense pas que ce soit valable. Spécifiez peut-être explicitement le système d'exploitation dont vous parlez.
Brian R. Bondy
1
Remarque: la norme ne dit rien à ce sujet. Ce n'est pas non plus garanti. C'est ainsi que cela fonctionne sur la plupart, sinon tous, des systèmes d'exploitation modernes, mais ils ne sont pas obligés de le faire et dans le passé, il y en avait qui étaient à la fois courants et qui ne faisaient pas ce nettoyage.
Edward Strange
5
Il existe différents systèmes d'exploitation en temps réel pour les petits appareils et ainsi de suite qui ne récupèrent pas la mémoire perdue lors de fuites. Votre question dépend du système d'exploitation dont vous parlez.
Brian Neal
14
Même avec des systèmes d'exploitation spécifiques protégés par la mémoire, vous devez toujours définir «fuite». Il est très possible pour les applications d'allouer des ressources «système» en dehors de leur propre espace mémoire (les descripteurs sont souvent utilisés pour les identifier dans le monde Windows). La fermeture de votre application ne garantit pas toujours que ces types de ressources sont libérés.
David le
34

Le système d'exploitation exécutant votre programme nettoie généralement la mémoire qui n'est pas libérée explicitement et gère qui ne sont pas fermées explicitement, mais cela n'est pas garanti par la norme C ++. Vous pouvez trouver un périphérique intégré qui ne libère 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 la RAM diminue.


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

Brian R. Bondy
la source
14

Utilisez-vous un système d'exploitation de bureau (Windows, Linux, etc.)? Si tel 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.

Vicky
la source
10

Généralement oui. 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 lorsqu'un programme se termine. La plupart gardent toujours un décompte 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 si rien n'y faisait référence - bien que il s'est généralement écrasé pour d'autres raisons avant que cela ne se soit accumulé pour causer un problème ...)

Jerry Coffin
la source
5

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

ravibhagw
la source
4

Cela dépend de la mémoire que vous avez divulguée. 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 de la plupart des systèmes d'exploitation sera automatiquement récupérée à la fin du processus.

Chiot
la source
6
Une partie de la mémoire ne peut pas être récupérée par le système d'exploitation - comme quoi?
2
Sur certains systèmes d'exploitation en temps réel, j'ai vu des blocs de tampon Ethernet spéciaux qui ne sont pas nettoyés lorsqu'un processus se termine.
Brian Neal
1
La mémoire partagée n'est généralement pas récupérée, car vous souhaiterez peut-être qu'elle persiste pour les processus transitoires à utiliser.
Brian Neal