Quelle est l'importance de réparer les fuites de mémoire?


19

J'ai trouvé par Valgring que certains programmes GTK + fuient la mémoire. Quelle est l'importance de réparer ces fuites? Je veux dire, souvent ces programmes fonctionnent très bien mais d'un autre côté, on ne peut jamais être sûr si l'on veut copier une partie du code qui fuit dans un autre programme. Et je ne sais pas si l'idée des programmes GTK + est de fonctionner rapidement et donc il y a des fuites.

Donc, si je trouve parfois une fuite de mémoire dans un programme open source, dois-je le réparer ou y a-t-il par exemple des problèmes d'efficacité et donc l'idée originale des programmeurs était d'écrire du petit code qui fuit?


17
Les fuites de mémoire sont toujours indésirables. Ils représentent des ressources que l'ensemble du système ne peut pas utiliser, y compris le programme hôte, jusqu'à la fin du programme.
recursion.ninja

Il y a suffisamment d'outils / bibliothèques pour traiter les fuites de mémoire. Cela en vaut la peine, car l'utilisation de l'API de votre côté peut être erronée.
Joop Eggen

1
En remarque - valgrind est génial mais peut signaler des faux positifs (je les ai vus dans GObject).
Maciej Piechotka

Le calcul dépend du traitement et de la mémoire: le premier étant le code et le second l'espace dans lequel il s'exécute.
imallett

1
"Codez toujours comme si la personne qui finit par maintenir votre code est un psychopathe violent qui sait où vous vivez."
Jesse C. Slicer

Réponses:


6

L'importance de corriger les fuites de mémoire dépend de la gravité du problème et de ce que vous devez faire d'autre est important. D'après mon expérience, les petites fuites de mémoire ont tendance à être plutôt bénignes pour la plupart des applications. La durée de vie d'une session d'application de bureau n'est généralement pas assez longue pour voir une dégradation due à une petite fuite de mémoire.

Si vous écrivez un serveur qui fonctionne 24h / 24 et 7j / 7, de petites fuites de mémoire peuvent s'accumuler au fil du temps et devenir un problème majeur. Mais c'est pourquoi de nombreuses entreprises planifient le redémarrage quotidien ou hebdomadaire de leurs serveurs. L'effort pour trouver des fuites de mémoire est souvent excessif par rapport à ce qui pourrait être gagné, il est donc plus facile de redémarrer les serveurs régulièrement et de passer à des choses plus importantes.


2
Je n'ai jamais travaillé dans une entreprise qui redémarrait leur serveur chaque semaine ... encore moins quotidiennement. Je suis d'accord que le coût pour réparer la fuite pourrait être trop élevé pour la réparer mais avoir cet état d'esprit n'est pas bon IMO
Rémi

@ Rémi La plupart, sinon la totalité, des serveurs de jeux MMO le font, généralement sur une base hebdomadaire.
Sjoerd

35

Pour les programmes courts, les fuites de mémoire ne sont pas aussi importantes; le système d'exploitation récupérera tout à la résiliation, mais il est possible que d'autres ressources ne soient pas libérées.

Quelle que soit la durée de fonctionnement, la fuite peut devenir incontrôlable en quelques heures ou s'empiler pendant des semaines sans être remarquée.

Mon conseil est de déposer un bug dans le tracker avec un correctif proposé, si le lead s'en soucie, il le corrigera.

Le type de fuite est également important. Il est possible que l'allocation qui fuit soit une allocation unique où le développeur s'est délibérément appuyé sur le système d'exploitation pour le nettoyage. Ceux-ci donneront un faux positif sur valgrind.


4
Je suis surtout d'accord. Je vous suggère cependant de souligner l'importance d'une fuite de mémoire. Les fuites de mémoire ne sont pas à prendre à la légère et peuvent provoquer des "fonctionnalités" intéressantes de votre application.
Vladimir Kocjancic

@VladimirKocjancic: +1 pour "fonctionnalité"
Emilio Garavaglia

1
Je veux simplement souligner qu'un ordinateur est capable d'effectuer ce traitement sur un million plusieurs millions de fois assez rapidement. N'oubliez jamais cela. Donc, si vous en tenez compte, je suis d'accord avec cette réponse, car cela dépend vraiment du programme. Pour un système embarqué destiné à fonctionner sans intervention humaine, les fuites de mémoire sont mortelles. Pour une implémentation "grep", vous ne vous en soucieriez probablement pas moins.
Dunk

2
@Dunk: Cela dépend: si vous grepparcourez un très gros fichier et que votre programme perd quelques octets pour chaque ligne d'entrée, vous risquez de manquer de mémoire.
Giorgio

0

À mon avis, certes dogmatique sur ce seul sujet, il n'y a aucune excuse pour les fuites physiques au moins dans une bibliothèque qui vise à être largement applicable. Je chercherais donc à bug les développeurs GTK + jusqu'à ce qu'ils le corrigent eux-mêmes.

Il est assez trivial pour une bibliothèque d'enregistrer des atexitrappels pour libérer la mémoire qu'elle alloue au moins lors du déchargement. S'il veut éviter les frais d'une cargaison d'allocations minuscules, il ne devrait pas les faire en premier lieu.

Même le programme le plus paresseux qui veut simplement allouer une cargaison de petits morceaux de mémoire à la fois pourrait utiliser un allocateur séquentiel simple qui purge simplement toute la mémoire à l'arrêt. Si l'allocateur ne veut même pas s'occuper de l'alignement, il peut simplement remplir chaque bloc qu'il regroupe aux limites d'alignement maximales. S'il a pu bénéficier de temps d'arrêt plus rapides en ne libérant pas tous ces petits morceaux de mémoire individuellement, il bénéficierait également de manière symétrique en échange d'efforts triviaux en utilisant un tel allocateur séquentiel qui regroupe la mémoire de manière séquentielle droite avec allocations beaucoup plus rapides quemallocet des modèles de mémoire plus conviviaux pour le cache, uniquement pour que tous les gros blocs de mémoire contiguë mis en commun par l'allocateur soient libérés lorsque la bibliothèque est terminée. Tout ce que la bibliothèque doit faire est alors de remplacer leurs mallocappels pour lesquels ils ne se soucient pas freede quelque chose comme seq_malloc, et d'appeler seq_purgeun atexitrappel pour libérer toute la mémoire allouée lors du déchargement.

Sinon, vous avez cette méchante bibliothèque encombrant les messages dans vos outils de détection de fuite de mémoire que vous devez maintenant filtrer. Pire, si vous ne les filtrez pas systématiquement, ils pourraient masquer les fuites dans votre propre application et vos collègues pourraient prendre l'habitude de les ignorer, réduisant l'utilité des outils de détection des fuites en premier lieu pour empêcher votre propre équipe de poussant le code qui fuit. C'est dégueulasse et moche et surtout je ne trouve pas que les arguments en faveur de faire cela délibérément soient convaincants étant donné la trivialité d'utiliser la solution ci-dessus.

Les fuites logiques (le type le plus complexe contre lequel même la collecte des ordures ne peut pas protéger) sont un problème plus complexe, et là je pourrais trouver une justification pour que les programmes de courte durée aient des fuites logiques tant qu'ils purgent toute la mémoire allouée sur arrêt car il nécessite une grande réflexion sur la gestion des ressources pour éviter les fuites logiques (sans doute davantage dans les langues qui ont GC). Mais je ne trouve aucune excuse raisonnable pour éviter les fuites physiques étant donné qu'elles sont triviales à éviter même dans les contextes les plus paresseux.

Quoi qu'il en soit, au moins je filtrerais les fuites à Valgrind afin qu'elles ne fassent pas au moins avec la capacité de votre équipe à repérer la vôtre.


1
Je me demande si les fuites ont quelque chose à voir avec le "codage des bateaux"?

0

FWIW, si un utilisateur a signalé une fuite dans une application sur laquelle je travaille, je serais très enclin à le corriger (surtout s'il a inclus du code pour le correctif dans le rapport de bogue!). Cela dit, cela pourrait ne pas se produire immédiatement si la fuite était faible et que d'autres problèmes étaient plus urgents (disons, un bug qui se produisait fréquemment). Mais je l'apprécierais certainement et travaillerais pour y remédier éventuellement. Vous devriez certainement leur faire savoir. Ils l'apprécieront et s'efforceront de le réparer (très probablement), ou ils s'en moqueront et tout cela vous aura coûté un certain temps.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.