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?
Réponses:
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.
la source
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.
la source
grep
parcourez 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.À 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
atexit
rappels 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 que
malloc
et 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 leursmalloc
appels pour lesquels ils ne se soucient pasfree
de quelque chose commeseq_malloc
, et d'appelerseq_purge
unatexit
rappel 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.
la source
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.
la source