mémoire allouée dynamicment après la fin du programme

Lorsqu’un programme C / C ++ contenant la mémoire allouée dynamicment (à l’aide de malloc / new) sans appels libres / supprimer est terminé, qu’advient-il de cette mémoire allouée dynamicment? Le système d’exploitation récupère-t-il la mémoire ou cette mémoire devient-elle inaccessible à d’autres programmes?

Je ne pense pas que la norme de langue soit garantie, mais les systèmes d’exploitation modernes qui prennent en charge la mémoire virtuelle éparse et la protection de la mémoire (telle que MacOS X, Linux, toutes les versions récentes de Windows et tous les combinés téléphoniques actuellement fabriqués) sont automatiquement nettoyés. up après les processus mal-comportés (quand ils se terminent) et libérer la mémoire pour vous. La mémoire rest indisponible, aussi longtemps que le programme est en cours d’exécution.

Si vous programmez sur des microcontrôleurs, sur MacOS 9 ou Earler, DOS ou Windows 3.x, vous devrez peut-être vous soucier des memory leaks, rendant la mémoire indisponible de manière permanente pour l’ensemble du système d’exploitation.

La plupart des systèmes d’exploitation modernes utilisent un gestionnaire de mémoire et tous les processus utilisateur ne voient que la mémoire virtuelle , qui n’est pas liée à la mémoire système réelle d’une manière que le programme pourrait inspecter. Cela signifie que les programmes ne peuvent pas simplement lire la mémoire d’un autre processus ou la mémoire du kernel. Cela signifie également que le gestionnaire de mémoire “libérera” complètement toute la mémoire affectée à un processus à la fin de celui-ci, de sorte que les memory leaks au sein du programme n’affectent généralement pas le rest du système (autre que le fait de forcer énorme quantité d’échange de disque et peut-être un comportement “manque de mémoire”).

Cela ne signifie en aucun cas que le fait de traiter les memory leaks avec légèreté est acceptable, cela signifie simplement qu’aucun programme ne peut corrompre de manière désinvolte d’autres processus sur des systèmes d’exploitation multitâches modernes (malgré les abus délibérés de privilèges administratifs).

Réponse courte: oui, le système d’exploitation libérera cette mémoire.

La plupart des systèmes d’exploitation vont libérer cette mémoire, mais il est déconseillé de recourir à ce comportement. Certains systèmes d’exploitation ne libéreront pas cette mémoire. Par exemple, les systèmes intégrés. Pour la portabilité, libérez toujours toute la mémoire que vous allouez.

C / C ++ n’a pas de fonctionnalité de récupération de place. Si vous allouez de la mémoire et ne la libérez pas, cela ne sert à rien tant que l’exécution du programme se poursuit. Ceci s’appelle une fuite de mémoire. Une fois l’exécution terminée, le système d’exploitation reprend cette mémoire et est à nouveau disponible.

Pendant l’exécution du programme, vous ne pouvez pas compter sur le système pour récupérer la mémoire. Ce serait une fonctionnalité de récupération de place trouvée dans de nombreux autres langages tels que Java et C #. Bien que le c ++ ordonné ramassé soit possible, je ne crois pas que les implémentations traditionnelles l’utilisent.

D’autre part, une fois que votre programme a terminé son exécution, le système d’exploitation doit récupérer la mémoire utilisée par le programme. Ainsi, lors de l’exécution, la mémoire rest fermée, mais est accessible à nouveau après la fermeture du programme.