La Meilleure Définition De Fuite De Mémoire
Je me sens comme si les développeurs parler des fuites de mémoire mais quand vous leur demandez ce qui signifie que la plupart n'ont aucune idée. Pour prévenir ces situations, nous allons décider sur une seule.
S'il vous plaît pas de Wikipédia définitions...
Quelle est votre meilleure définition d'un
fuite de mémoire et qu'est-ce que le meilleure façon
pour les prévenir?
- Je trouve que Brian Gianforcaro la réponse est la meilleure et la plus succincte.
- Pourquoi ne pas accepter de Wikipédia définition?
- Swink: Parce que ce serait un flic de réponse. 🙂
- Je crois que je vais essayer d'obtenir à l'est: qu'espérez-vous d'ajouter le concept ici? C'est l'une de ces questions avec une réponse correcte, et Wikipédia a elle. Donc je ne vois pas l'intérêt. (Pas y compris l'ajout ultérieur de "et quelle est la meilleure façon de les prévenir".)
Vous devez vous connecter pour publier un commentaire.
Il y a deux définitions (au moins pour moi):
Naïf définition: l'Échec de la libération inaccessible de la mémoire, qui ne peut plus être attribué de nouveau par quelque procédé au cours de l'exécution de l'allocation de processus. Cela peut généralement être guéri par l'aide de GC (Garbage Collection) techniques ou détectés par des outils automatisés.
Subtile définition: l'Échec de la libération accessible de la mémoire qui n'est plus nécessaire pour que votre programme puisse fonctionner correctement. C'est presque impossible à détecter à l'aide d'outils automatisés ou par des programmeurs qui ne sont pas familiers avec le code. Bien que, techniquement, ce n'est pas une fuite, il a les mêmes implications que de la naïveté de l'un. Ce n'est pas ma propre idée. Vous pouvez venir à travers des projets qui sont écrites dans une de ces ordures de la langue, mais tout de même citer la fixation des fuites de mémoire dans leurs modifications.
Mémoire allouée ne peut pas être utilisé parce que la référence à ce qui a été perdu.
Définition: l'Échec de la libération de la mémoire après l'attribution.
Le processus dans lequel la mémoire de ressources sont allouées et pas correctement libérée une fois n'est plus nécessaire, souvent introduits par de mauvaises pratiques de codage.
On a construit dans les manières, dans certaines langues, pour aider à les prévenir, bien que la meilleure façon de les éviter est de façon diligente observation du code de chemins d'exécution et la révision du code. Méthodes de court et singulièrement le dessein aide à maintenir l'utilisation des ressources étroitement définies et moins susceptibles de se perdre dans le shuffle, ainsi.
Il y a deux façons d'une fuite de mémoire peut être définie.
Tout d'abord, si les données ne sont pas libérées quand il n'a plus toutes ses références, que les données sont inaccessibles (sauf si vous avez quelques pointeur endommagé ou lire au-delà des données dans une mémoire tampon ou quelque chose). En gros, si vous n'avez pas/sans supprimer les données allouées sur le tas, il devient inutilisable et simplement les déchets de la mémoire.
Il peut y avoir des cas où un pointeur est perdue, mais les données sont toujours accessibles. Par exemple, si vous stockez le pointeur sur un int, ou de stocker un décalage du pointeur (en utilisant l'arithmétique des pointeurs), vous pouvez toujours obtenir l'original pointeur de retour.
Dans cette première définition, les données sont traitées par les ramasseurs d'ordures, qui permettent de garder une trace du nombre de références à des données.
Seconde, la mémoire est essentiellement une fuite si elle n'est pas libérée/supprimé lors de la dernière utilisée. Il peut être référencé, et libre immédiatement-mesure, mais l'erreur a été de ne pas le faire. Il y a peut être une raison valable (par exemple, dans le cas où un destructeur a un étrange effet secondaire), mais qui indique une mauvaise conception du programme (à mon avis).
Ce deuxième type de fuite de mémoire se produit souvent lors de l'écriture de petits programmes qui utilisent des e /s de fichier. Vous ouvrez le fichier, écrire vos données, mais ne pas le fermer une fois que vous avez terminé. Le FICHIER* peut-être encore à l'intérieur de la portée, et facilement fermer. Encore une fois, il y a peut être quelques raisons pour cela (comme le verrouillage de l'accès en écriture par d'autres programmes), mais pour moi c'est un indicateur de mauvaise conception.
Dans cette deuxième définition, les données ne sont pas traitées par les ramasseurs d'ordures, à moins que le compilateur/interpréteur est intelligent (ou muette) assez pour savoir qu'il ne sera pas utilisé plus longtemps, et ce en libérant les données ne cause pas d'effets secondaires du tout.
w:
Mémoire n'est pas libérée, quand il n'est plus nécessaire, et n'est plus "accessible". Par exemple, dans le code non managé, si j'utilise "nouveau" pour instancier un objet, mais je n'utilise pas de "supprimer" quand je suis fait avec lui (et mon pointeur a disparu hors de leur portée ou de quelque chose).
La meilleure façon de prévenir les probablement dépend de qui vous demandez et ce que la langue que vous utilisez. La collecte des ordures est une bonne solution pour elle, bien sûr, mais il peut y avoir des coûts associés à ce qui n'est pas une grosse affaire, sauf si vous la performance est votre principale préoccupation. La collecte des ordures ne sont pas toujours disponibles, encore une fois, selon la langue que vous utilisez.
Alternativement, vous pouvez assurez-vous d'avoir les suppressions et/ou des destructeurs en place. Il y a beaucoup de méthodes et d'outils pour détecter les fuites de mémoire en tant que bien, mais cela dépendra de la langue et/ou de l'IDE que vous utilisez.
Fuite de mémoire: à Défaut de libérer de la mémoire que vous n'avez plus besoin avant soit:
Meilleure façon de prévenir les Fuites de Mémoire: libérer de la mémoire dès qu'il n'est plus nécessaire.
Voici quelques techniques pour la prévention ou la détection des fuites de mémoire:
Tenir compte de votre algorithme en termes de consommation de mémoire. D'autres répondants ont mentionné le fait que vous n'avez pas à perdre le pointeur sur un élément alloué à une fuite de mémoire. Même si votre application contient zéro pointeur de bugs, vous pouvez effectivement encore une fuite de mémoire si vous vous tenez sur les éléments attribués temps après que vous avez réellement besoin d'eux.
Le profil de votre application. Vous pouvez utiliser le débogueur mémoire des outils comme Valgrind ou Purifier pour trouver les fuites.
Boîte noire test. Regardez ce qui se passe à votre code compilé après vous nourrir de grands ensembles de données, ou de la laisser fonctionner pendant de longues périodes de temps. Voir si sa mémoire a tendance à croître sans limite.
Toutes les définitions données ici (au moment où j'ai écrit cela, nous avons obtenu des réponses de meilleure qualité depuis) ne parviennent pas à traiter un cas limite:
Vous avez un singleton qui alloue de la mémoire lors de la création et de cette mémoire est normalement tenue, tant que le programme est en cours d'exécution, même si l'usage courant qui est fait et on ne sait pas si son utilisation future sera jamais faite ou non. Cela se fait généralement en raison de la surcharge de recréer.
Par le "fail gratuit quand en fait" standard cela serait considéré comme une fuite et j'ai vu des fuites d'outils de reporting appel à de telles choses fuites que la mémoire était encore en usage. (Et, en fait, le code peut ne pas contenir de code capable de nettoyer de l'objet vers le haut.)
Cependant, j'ai rencontré code de cette nature dans le compilateur bibliothèques de l'avant, même lorsque le coût de recréer l'objet n'est pas tout que de grands.
Fuite ou pas?
edit: Cette réponse est fausse. Je pars comme un exemple de la façon dont il est facile de se tromper sur quelque chose que vous pensez que vous connaissez très bien. Merci à tous ceux qui ont relevé mon erreur.
Une fuite de mémoire est: Une erreur de programmation. Votre logiciel emprunte une partie de la mémoire système, il utilise, et ne parvient pas à revenir au système, quand il a terminé. Cela signifie que cette partie de la mémoire ne peut jamais être utilisé par d'autres programmes jusqu'à ce que le système est redémarré. Beaucoup de ces fuites pourraient utiliser toute la mémoire disponible, résultant en un complètement inutiles du système.
Pour empêcher les fuites de mémoire, la pratique RIIA, et toujours tester votre logiciel. Il existe de nombreux outils disponibles pour cette tâche.