web-dev-qa-db-fra.com

Différence entre le pointeur pendant et la fuite de mémoire

Je ne comprends pas la différence entre un pointeur suspendu et une fuite de mémoire. Comment ces deux termes sont-ils liés?

74
dead programmer

Un pointeur suspendu pointe vers la mémoire déjà libérée. Le stockage n'est plus alloué. Essayer d'y accéder peut provoquer une erreur de segmentation.

Manière courante de se retrouver avec un pointeur en suspens:

char* func()
{
   char str[10];
   strcpy(str,"Hello!");
   return(str); 
}
//returned pointer points to str which has gone out of scope. 

Vous retournez une adresse qui était une variable locale et qui aurait été hors de portée lorsque le contrôle a été renvoyé à la fonction appelante. (Comportement indéfini)

Un autre exemple courant de pointeur en suspens est l’accès d’un emplacement mémoire via un pointeur, après que le nom free a été appelé explicitement sur cette mémoire.

int *c = malloc(sizeof(int));
free(c);
*c = 3; //writing to freed location!

Une fuite de mémoire est une mémoire qui n'a pas été libérée. Il n'y a aucun moyen d'accéder (ou de le libérer) maintenant, car il n'y a plus aucun moyen d'y accéder. (Par exemple, un pointeur qui était la seule référence à un emplacement mémoire alloué dynamiquement (et non libéré) qui pointe ailleurs maintenant.)

void func(){
    char *ch;
    ch = (char*) malloc(10);
}
//ch not valid outside, no way to access malloc-ed memory

Char-ptr ch est une variable locale qui sort de la portée à la fin de la fonction, laissant filtrer 10 octets alloués dynamiquement.

135
Anirudh Ramanathan

Vous pouvez les considérer comme les opposés les uns des autres.

Lorsque vous libérez une zone de mémoire tout en gardant un pointeur dessus, ce pointeur est suspendu:

char *c = malloc(16);
free(c);
c[1] = 'a'; //invalid access through dangling pointer!

Lorsque vous perdez le pointeur tout en maintenant la mémoire allouée, vous avez une fuite de mémoire:

void myfunc()
{
    char *c = malloc(16);
} //after myfunc returns, the the memory pointed to by c is not freed: leak!
21
Greg Inozemtsev

Un pointeur dangling est un pointeur ayant une valeur (pas NULL) qui fait référence à une mémoire non valide pour le type d'objet que vous attendez. Par exemple, si vous définissez un pointeur sur un objet, vous écrasez cette mémoire par une autre information non liée ou libérez la mémoire si elle était allouée de manière dynamique.

Une fuite de mémoire se produit lorsque vous allouez de manière dynamique de la mémoire à partir du tas, mais que vous ne la libérez jamais, peut-être parce que vous avez perdu toutes ses références.

Ils sont liés en ce qu'ils sont tous deux des situations relatives à des pointeurs mal gérés, en particulier en ce qui concerne la mémoire allouée dynamiquement. Dans une situation (pointeur en suspens), vous avez probablement libéré la mémoire mais essayé de la référencer par la suite; dans l'autre (fuite de mémoire), vous avez oublié de libérer entièrement la mémoire!

14
maerics

Pointeur suspendu

Si un pointeur pointe l'adresse mémoire d'une variable, mais après qu'une variable a été supprimée de cet emplacement mémoire, alors que le pointeur pointe toujours cet emplacement mémoire. Un tel pointeur est appelé pointeur pointeur et ce problème est appelé problème de pointeur pointeur.

#include<stdio.h>

  int *call();

  void main(){

      int *ptr;
      ptr=call();

      fflush(stdin);
      printf("%d",*ptr);

   }

 int * call(){

   int x=25;
   ++x;
   return &x;
 }

Sortie: valeur de garbage

Remarque: Dans certains compilateurs, vous pouvez obtenir un message d'avertissement indiquant l'adresse de retour de variable locale ou temporaire

Explication: la variable x est une variable locale. Sa portée et sa durée de vie se situent dans l'appel de la fonction. Par conséquent, après que l'adresse retournée de la variable x soit devenue morte et que le pointeur est toujours pointé, ptr pointe toujours vers cet emplacement.

Solution de ce problème: Définissez la variable x comme variable statique . Dans Word, nous pouvons dire qu'un pointeur dont l'objet de pointage a été supprimé s'appelle un pointeur suspendu.

Fuite de mémoire

En informatique, une fuite de mémoire se produit lorsqu'un programme informatique gère de manière incorrecte les affectations de mémoire . Comme par simple moyen, nous avons alloué la mémoire et non un autre terme de langage libre ne le lâchez pas.

6
PeterParker

Le pointeur permet de créer une portée définie par l'utilisateur pour une variable, appelée variable dynamique. La variable dynamique peut être une variable unique ou un groupe de variables du même type (array) ou un groupe de variables de types différents (struct). La portée de la variable locale par défaut commence lorsque le contrôle entre dans une fonction et se termine lorsque le contrôle sort de cette fonction. La portée globale vairable par défaut commence à l'exécution du programme et se termine à la fin du programme. 

Mais la portée d'une variable dynamique qui tient par un pointeur peut commencer et se terminer à n'importe quel moment de l'exécution d'un programme, ce qui doit être décidé par un programmeur. Une fuite de mémoire et une perte de mémoire n'interviennent dans l'image que si un programmeur ne gère pas la fin de la portée. 

Une fuite de mémoire surviendra si un programmeur n'écrit pas le code (free du pointeur) pour la fin de la portée des variables dynamiques. Une fois le programme terminé, la mémoire de processus perdue sera libérée. À ce moment, la mémoire perdue sera également libérée. Mais cela causera un très grave problème pour un processus qui dure longtemps.

Une fois que la portée de la variable dynamique arrive à la fin (libérée), NULL doit être affecté à la variable de pointeur. Sinon, si le code y accède à tort, un comportement indéfini se produira. Ainsi, le pointeur en suspens n’est autre qu’un pointeur qui pointe une variable dynamique dont la portée est déjà terminée.

3
rashok

Fuite de mémoire : Lorsqu'il existe une zone mémoire dans un segment de mémoire mais aucune variable dans la pile pointant vers cette mémoire.

char *myarea=(char *)malloc(10);

char *newarea=(char *)malloc(10);

myarea=newarea;

Pointeur suspendu : Quand une variable de pointeur dans une pile mais pas de mémoire dans le tas.

char *p =NULL;

Un pointeur suspendu essayant de déréférencer la référence sans allouer d'espace entraînera une erreur de segmentation.

3
user2264571

Un pointeur pointant vers un emplacement mémoire supprimé (ou libéré) est appelé pointeur suspendu. 

#include <stdlib.h>
#include <stdio.h> 
 void  main()
 {
    int *ptr = (int *)malloc(sizeof(int));
    // After below free call, ptr becomes a 
    // dangling pointer
    free(ptr); 
 }

pour plus d'informations, cliquez ICI

0
Niravdas

Un pointeur pointant vers un emplacement mémoire supprimé (ou libéré) est appelé pointeur suspendu. Il existe trois manières différentes pour lesquelles Pointer agit en tant que pointeur suspendu.

  1. Désaffectation de mémoire
  2. Appel de fonction
  3. La variable sort du cadre

—— de https://www.geeksforgeeks.org/dangling-void-null-wild-pointers/

0
Lalit