Quelles sont certaines des raisons générales de la fuite de mémoire et de l'erreur de segmentation?

StackOverflow https://stackoverflow.com/questions/1610407

  •  05-07-2019
  •  | 
  •  

Question

Quelles sont certaines des raisons générales des erreurs de type fuite de mémoire et erreur de segmentation?

Était-ce utile?

La solution

Segfaults:

  • utilisation des pointeurs en suspens: ne pas réinitialiser les pointeurs après la désallocation
  • ne vérifie pas un pointeur avant utilisation
  • ne pas initialiser les variables / membres

Fuites de mémoire / de ressources:

  • en oubliant de libérer la ressource (mémoire disponible, fichier fermé, ...)
  • dans les environnements avec garbage collector: création d'un anneau d'objets de référence

Comment détecter / éviter:

  • pointeurs en suspens: règle de codage, réinitialisation stricte des pointeurs après désallocation
  • utilisez un vérificateur de code statique pour éviter la plupart des segfaults
  • utilisez un analyseur de code dynamique pour vérifier l'absence de fuites de ressources

Autres conseils

Fuites de mémoire : il s'agit généralement d'un langage comme C, dans lequel vous gérez la mémoire manuellement. Dans ce cas, vous alloueriez de la mémoire sans la libérer une fois l’utilisation terminée. Les allocations continuent de s'accumuler pendant l'exécution de l'application et la mémoire ne peut pas être libérée avant la fin de l'exécution du processus. Fuites de mémoire (Wikipedia)

Erreurs de segmentation : la raison la plus courante de ce type d'erreur est l'accès à une partie de la mémoire inexistante ou située en dehors de la mémoire autorisée du programme en cours d'exécution (par exemple: si vous avez essayé d'accéder à la mémoire, le système d'exploitation est chargé). Cela signifie généralement que vous essayez d'utiliser un mauvais pointeur. Par exemple:

int* ptr;
...
...
...
*ptr = 5;

provoquerait un segfault car ptr est un pointeur nul (ou garbage) et vous n'avez pas alloué de mémoire au pointeur auquel le pointeur est destiné. Erreur de segmentation (Wikipedia)

Beaucoup, y compris:

  • allocation d'un bloc de mémoire puis utilisation de plus que ce qui a été alloué,
  • allouer de la mémoire sans la libérer,
  • ne pas initialiser correctement les pointeurs de données,
  • ne pas initialiser correctement les pointeurs de fonction,
  • fonctions d'appel avec des nombres ou des valeurs de paramètres incorrects,
  • essayer de lire ou d'écrire avec des pointeurs NULL,
  • liaison incorrecte aux bibliothèques ou aux bibliothèques incorrectes.

Toutes ne s’appliquent pas à toutes les langues, mais voici quelques éléments utiles pour commencer à réfléchir.

Voir la série Effective C ++ dans Addison Wesley, très bon pour le problème en question. Notez que dans l'utilisation du pointeur, il est nécessaire de supprimer individuellement tous les éléments, puis de supprimer le pointeur. Cela nécessite des compétences et est souvent incorrect, ce qui entraîne des erreurs cachées qui n'apparaissent pas facilement. Les autres affiches ont les réponses, je n’ajoute qu’un détail supplémentaire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top