86 votes

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?

151voto

Anirudh Ramanathan Points 25113

Une balançant pointeur pointe vers la mémoire qui a déjà été libérée. Le stockage n'est plus attribué. En essayant d'accès, il peut provoquer une erreur de Segmentation.

Commune de la façon de se retrouver avec une balançant pointeur:

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

Vous êtes de retour d'une adresse qui est une variable locale, qui aurait disparu de la portée par le contrôle du temps a été renvoyé à la fonction appelante. (Comportement indéfini)

Une autre commune qui pendouille pointeur est un exemple d'accès à un emplacement de la mémoire via le pointeur, après libre a été explicitement appelé à 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é, il n'y a aucun moyen d'accès (ou libre) maintenant, comme il n'existe pas de moyens pour obtenir de plus. (E. g. un pointeur qui a été la seule référence à un emplacement de la mémoire allouée dynamiquement (et non libéré) qui pointe quelque part d'autre 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 est hors de portée à la fin de la fonction, de fuite de la allouée dynamiquement 10 octets.

23voto

Greg Inozemtsev Points 2624

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!
 

16voto

maerics Points 47743

Une balançant pointeur est celui qui a une valeur (not NULL), qui fait référence à de la mémoire qui n'est pas valide pour le type d'objet que vous attendez. Par exemple, si vous définissez un pointeur vers un objet puis écrasait que la mémoire de quelque chose d'autre ou non de libérer la mémoire si elle a été allouée dynamiquement.

Une fuite de mémoire , c'est quand vous allouer dynamiquement de la mémoire dans le tas, mais jamais gratuit, il est, peut-être parce que vous avez perdu toutes ses références.

Elles sont liées en ce qu'elles sont à la fois les situations de mal gérer les pointeurs, en particulier concernant la mémoire allouée dynamiquement. Dans une situation bancale pointeur), vous avez sans doute libéré de la mémoire, mais a tenté de référence par la suite; dans l'autre (fuite de mémoire), vous avez oublié de libérer de la mémoire, entièrement!

6voto

PeterParker Points 273

*balançant pointeur *

Si un pointeur pointant vers l'adresse mémoire d'une variable quelconque, mais après quelques variables a supprimé à partir de cet emplacement de la mémoire alors que le pointeur est toujours de pointage tels emplacement de mémoire. Un tel pointeur est connu comme balançant pointeur et ce problème est connu comme balançant problème de pointeur.

#include

  int *call();
  void main(){

      int *ptr;
      ptr=call();

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

   }
 int * call(){

   int x=25;
     ++x;

  return &x;
 }

Sortie: la valeur d'Ordures Remarque: Dans certains compilateur, vous pouvez obtenir message d'avertissement de retourner l'adresse d'une variable locale ou temporaire

Explication: la variable x est une variable locale. Son champ d'application et la durée de vie est dans l'appel de fonction donc après le retour de l'adresse de x variable x est devenu mort et le pointeur pointe toujours ptr pointe toujours à cet emplacement.

La Solution de ce problème: Faire de la variable x est une variable statique. En d'autres mots, nous pouvons dire un pointeur dont le pointage de l'objet a été supprimé est appelé balançant pointeur.

Fuite De Mémoire

En informatique, une fuite de mémoire se produit lorsqu'un programme d'ordinateur d'une façon incorrecte gère les allocations de mémoire. Comme par simple nous avons la mémoire allouée et non pas Libre d'autres langues terme-dire de ne pas le publier appel fuite de mémoire c'est fatal pour l'application et inattendu crash.

3voto

raja ashok Points 2358

Pointeur permet de créer des utilisateurs définis dans la portée d'une variable, qui est appelée variable Dynamique. Variable dynamique peut être variable ou un groupe de variables de même type (array) ou d'un groupe de variables de différents types (struct). Par défaut la variable locale de la portée commence lorsque le contrôle entre en fonction et se termine lorsque le contrôle du sort de cette fonction. Par défaut global vairable portée commence à l'exécution du programme et se termine une fois le programme terminé.

Mais la portée d'une variable dynamique qui tient par un pointeur peut commencer et se terminer à n'importe quel point dans l'exécution du programme, qui doit être décidé par un programmeur. Bancale et une fuite de mémoire vient de l'image que si un programmeur ne marche pas à gérer la fin de la portée.

Fuite de mémoire se produit si un programmeur, il ne marche pas écrire le code (free de pointeur) pour la fin de la portée pour les variables dynamiques. De toute façon une fois que le programme se termine processus complet de la mémoire sera libérée, à l'époque, cette fuite de mémoire qui va être libéré. Mais il sera la cause d'un problème très sérieux pour un processus qui est en cours d'exécution longtemps.

Une fois la portée de la variable dynamique vient à la fin(libre), NULL doit être affecté à la variable du pointeur. Sinon, si le code à tort accède à un comportement indéterminé va se passer. Donc bancale pointeur n'est rien, mais un pointeur qui pointe une variable dynamique dont la portée est déjà fini.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X