Dois-je libérer de la mémoire allouée en cas de terminaison anormale?

Mon programme (un navigateur Web en mode texte) alloue dynamicment de la mémoire.

Je fais des blocs inutiles au cours de l’exécution, bien sûr. Et je libère tout avant la fin normale – de sorte que les vérificateurs de fuite de mémoire ne me donnent pas de faux positifs (et par souci de souplesse si des modifications importantes s’imposaient).

Maintenant, ce que je ne fais pas , c’est libérer de la mémoire avant une fin anormale. (Actuellement, mon programme se termine sur les signaux et après l’échec de mallocs / reallocs.)

Ma question est la suivante: considérez-vous ce mauvais style? Devrais-je être libéré en cas de terminaison anormale?

Non, je pense qu’il est parfaitement acceptable de simplement lever les mains en l’air et de laisser le système d’exploitation récupérer la mémoire après la fin du programme. Je pense que s’il s’agit vraiment d’une situation anormale et que le programme doit être arrêté, un programme sage doit tout simplement nettoyer toutes les ressources / verrous du disque et quitter le plus rapidement possible.

À mon avis, il n’est pas nécessaire de libérer la mémoire lors d’un crash. Lorsque votre processus se termine, le système d’exploitation récupère la mémoire. Il ne vous rest donc plus qu’à quitter.

D’autre part, d’autres ressources (par exemple, des fichiers ouverts) doivent être fermées ou au moins vidées – sinon, elles ne peuvent pas être stockées / stockées incomplètes en raison de la mise en mémoire tampon.

Vous n’avez pas besoin de récupérer de la mémoire lors d’une terminaison normale, sauf pour éviter les faux positifs dans les outils de détection de fuite.

Si votre programme se termine de manière anormale, selon la cause, il est possible que vous ne puissiez pas libérer de la mémoire. Par exemple, un SIGSEGV résultant d’un tas corrompu signifie que même essayer de libérer d’autres éléments sur le tas peut être un exercice sans espoir.

Une fin anormale de votre processus ne conduit pas à des blocs de mémoire qui ne peuvent pas être utilisés par d’autres processus (ce qui signifie effectivement qu’ils sont libres), s’ils ont été alloués par celui-ci.

Nous allouons / libérons de la mémoire à l’aide de directives de système d’exploitation de sorte qu’un système d’exploitation non bogué garde une trace des blocs de mémoire pour chaque processus et les traduise en un espace de mémoire virtuelle contigu. À la mort du processus, le chargeur du système d’exploitation le signale et toute la mémoire est rappelée. Les choses se compliquent lorsque les processus partagent la mémoire.

Les processus de peering, s’ils ne sont pas dérivés / lancés / branchés par votre processus (par exemple, considérons un composant externe servant de nombreux processus à accéder à des ressources multimédia), peuvent avoir créé de la mémoire (par exemple, une mémoire tampon) pour servir votre processus. Selon la politique de propriété de ces composants externes, cette mémoire peut ne pas être libre lors de la mort du processus servi.

Je vous conseille d’essayer l’audit de toute la mémoire engagée avant et après des scénarios de fin anormale.

Non, sauf si votre programme se termine toujours de manière anormale. 🙂 Quoi qu’il en soit, le système d’exploitation fait du bon travail en le libérant. En fait, de nombreux programmeurs paresseux ne se soucient même pas de libérer des choses avec une terminaison normale – mais cela rend difficile la détection d’autres memory leaks (celles qui posent un réel problème).

Seulement si votre système d’exploitation ne récupère pas de mémoire à la fin du programme. DOS et sa «mémoire rémanente» en sont un exemple. Sur la plupart des systèmes d’exploitation modernes, la terminaison anormale n’est pas un problème ().

En cas de terminaison anormale, vous souhaitez effectuer le moins de traitement possible. Minimiser le bricolage avec le processus d’abandon signifie que vous pouvez vous approcher le plus possible de la raison de l’abandon et tout traitement ultérieur peut être considéré comme “contaminant” le processus, ce qui le rend plus difficile à déboguer.