118 votes

Dans quelle mesure peut-fuites de mémoire en aller?

J'ai couru dans les fuites de mémoire à plusieurs reprises. Habituellement, lorsque je suis en malloc-ing comme il n'y a pas de demain, ou pendantes FILE *s comme du linge sale. De manière générale, j'assume (lire: l'espoir désespérément) que toute la mémoire est nettoyé au moins quand le programme se termine. Existe-il des situations où une fuite de mémoire ne seront pas recueillies lorsque le programme s'arrête ou se bloque?

Si la réponse varie largement d'une langue-à-langue, alors concentrons-nous sur le C(++).

Veuillez noter hyperbolique de l'utilisation de l'expression, "comme il n'y a pas de demain", et "bancale ... comme du linge sale'. Dangereux* malloc*ing peut blesser ceux que vous aimez. Aussi, soyez prudent avec le linge sale.

111voto

Joni Points 46728

Pas de. Les systèmes d'exploitation libérer toutes les ressources détenues par les processus de sortie.

Cela s'applique à toutes les ressources du système d'exploitation gère la mémoire, les fichiers ouverts, les connexions réseau, les poignées de fenêtre...

Cela dit, si le programme est en cours d'exécution sur un système embarqué sans un système d'exploitation, ou avec un très simple ou buggy système d'exploitation, la mémoire peut être inutilisable jusqu'à ce qu'un redémarrage. Mais si vous avez été dans cette situation, vous ne serait probablement pas en posant cette question.

Le système d'exploitation peut prendre du temps à libérer certaines ressources. Par exemple le port TCP d'un serveur de réseau utilise pour accepter les connexions peut prendre de quelques minutes à devenir libre, même si elle est correctement fermée par le programme. Un réseau de programme peut aussi tenir à distance des ressources comme des objets de base de données. Le système distant doit libérer ces ressources lorsque la connexion réseau est perdue, mais il peut prendre plus de temps que le système d'exploitation local.

47voto

ouah Points 75311

La Norme ne précise pas que la mémoire allouée par malloc est libéré lorsque le programme se termine. Ceci est fait par le système d'exploitation et non tous les Systèmes d'exploitation (généralement ceux-ci sont dans le monde embarqué) libérer la mémoire quand le programme se termine.

28voto

Abhijit Points 24122

Que toutes les réponses ont porté sur la plupart des aspects de votre question.w.r.t. de nouveaux Systèmes d'exploitation, mais historiquement, il y en a un qui vaut la peine de mentionner si vous avez déjà programmé dans le DOS du monde. Terminant et de Séjour de Résident (TSR) programmes habituellement de contrôle de retour pour le système, mais réside dans la mémoire qui pourrait être relancée par un logiciel / matériel d'interruption. Il était normal de voir des messages comme "out of memory! essayer de décharger certains de vos programmes résidents (Tsr)" lorsque l'on travaille sur ces Systèmes d'exploitation.

Donc, techniquement, le programme se termine, mais parce qu'il se trouve encore sur la mémoire, une fuite de mémoire ne serait pas publié, à moins que vous décharger du programme.

De sorte que vous pouvez considérer cela comme un autre cas à part OSes pas à la reconquête de la mémoire, soit parce que c'est buggé ou parce que le système d'exploitation embarqué est conçu pour faire.

Je me souviens d'un exemple de plus. Customer Information Control System (CICS), une transaction server qui s'exécute principalement sur des mainframes IBM est de la pseudo-conversation. Lorsqu'il est exécuté, il traite les données saisies par l'utilisateur, génère un autre jeu de données pour l'utilisateur, transfert au terminal de l'utilisateur nœud et se termine. Sur l'activation de l'attention de la clé, il a de nouveau fait revivre pour traiter un autre ensemble de données. Parce que la façon dont il se comporte, techniquement, encore une fois, le système d'exploitation ne pas récupérer de la mémoire de la résiliation CICS Programmes, à moins que vous recyclez la CICS transaction server.

8voto

Andre Kostur Points 246

Comme les autres l'ont dit, la plupart des systèmes d'exploitation permettra de récupérer de la mémoire allouée à la fin du processus (et probablement d'autres ressources comme les sockets réseau, les descripteurs de fichiers, etc).

Cela dit, la mémoire peut ne pas être la seule chose que vous ayez à vous soucier lorsque vous traitez avec de new/delete (au lieu de raw malloc/free). La quantité de mémoire allouée à nouveau peut obtenir la remise en état, mais les choses qui peut être fait dans les destructeurs des objets ne se produira pas. Peut-être le destructeur de la classe écrit une sentinelle de la valeur dans un fichier au moment de la destruction. Si le processus ne se termine, le descripteur de fichier peut se rincé et de la mémoire récupérée, mais que sentinelle de la valeur n'aurais pas écrit.

Morale de l'histoire, toujours nettoyer après vous. Ne pas laisser les choses se pendre. Ne comptez pas sur l'OS nettoyer après vous. Nettoyer après vous.

7voto

john Points 23351

C'est plus susceptibles de dépendre du système d'exploitation que la langue. En fin de compte n'importe quel programme dans n'importe quelle langue il obtiendra de la mémoire du système d'exploitation.

Je n'ai jamais entendu parler d'un système d'exploitation qui n'a pas de recycler la mémoire quand un programme de sorties et des accidents. Donc, si votre programme a une limite supérieure sur la mémoire qu'il a besoin d'allouer, puis il suffit de l'allocation et de ne jamais libérer est parfaitement raisonnable.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X