Unterschied zwischen baumelndem Zeiger und Speicherverlust

79

Ich verstehe den Unterschied zwischen einem baumelnden Zeiger und einem Speicherverlust nicht. Wie hängen diese beiden Begriffe zusammen?

toter Programmierer
quelle

Antworten:

144

Ein baumelnder Zeiger zeigt auf den Speicher, der bereits freigegeben wurde. Der Speicher ist nicht mehr zugeordnet. Der Versuch, darauf zuzugreifen, kann einen Segmentierungsfehler verursachen.

Übliche Methode, um einen baumelnden Zeiger zu erhalten:

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

Sie geben eine Adresse zurück, bei der es sich um eine lokale Variable handelt, die zum Zeitpunkt der Rückgabe der Steuerung an die aufrufende Funktion den Gültigkeitsbereich überschritten hätte. (Undefiniertes Verhalten)

Ein weiteres häufiges Beispiel für einen baumelnden Zeiger ist der Zugriff auf einen Speicherort über einen Zeiger, nachdem free explizit für diesen Speicher aufgerufen wurde.

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

Ein Speicherverlust ist ein Speicher, der nicht freigegeben wurde. Es gibt keine Möglichkeit, darauf zuzugreifen (oder ihn freizugeben), da es keine Möglichkeit mehr gibt, darauf zuzugreifen. (ZB ein Zeiger, der war der einzige Hinweis auf einen Speicherplatz dynamisch zugewiesen (und befreit nicht) , die Punkte woanders jetzt.)

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

Char-ptr ch ist eine lokale Variable, die am Ende der Funktion den Gültigkeitsbereich verlässt und die dynamisch zugewiesenen 10 Bytes verliert .

Anirudh Ramanathan
quelle
Dieser Artikel könnte auch hilfreich sein stackoverflow.com/questions/127386/…
bkausbk
21

Sie können sich diese als Gegensätze vorstellen.

Wenn Sie einen Speicherbereich freigeben, aber dennoch einen Zeiger darauf behalten, baumelt dieser Zeiger:

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

Wenn Sie den Zeiger verlieren, aber den zugewiesenen Speicher beibehalten, tritt ein Speicherverlust auf:

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

Ein baumelnder Zeiger hat einen Wert (nicht NULL), der sich auf einen Speicher bezieht, der für den erwarteten Objekttyp nicht gültig ist. Wenn Sie beispielsweise einen Zeiger auf ein Objekt setzen, überschreiben Sie diesen Speicher mit etwas anderem, das nichts damit zu tun hat, oder geben den Speicher frei, wenn er dynamisch zugewiesen wurde.

Ein Speicherverlust liegt vor, wenn Sie Speicher dynamisch vom Heap zuweisen, ihn jedoch nie freigeben, möglicherweise weil Sie alle Verweise darauf verloren haben.

Sie hängen insofern zusammen, als es sich um Situationen handelt, die sich auf nicht verwaltete Zeiger beziehen, insbesondere auf dynamisch zugewiesenen Speicher. In einer Situation (baumelnder Zeiger) haben Sie wahrscheinlich den Speicher freigegeben, aber danach versucht, darauf zu verweisen. in der anderen (Speicherverlust) haben Sie vergessen, den Speicher vollständig freizugeben!

Maerics
quelle
6

Dangling Pointer

Wenn ein Zeiger auf die Speicheradresse einer Variablen zeigt, jedoch nachdem eine Variable aus diesem Speicherort gelöscht wurde, während der Zeiger noch auf diesen Speicherort zeigt. Ein solcher Zeiger ist als baumelnder Zeiger bekannt, und dieses Problem ist als baumelndes Zeigerproblem bekannt.

#include<stdio.h>

  int *call();

  void main(){

      int *ptr;
      ptr=call();

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

   }

 int * call(){

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

Ausgabe: Müllwert

Hinweis: In einigen Compilern wird möglicherweise eine Warnmeldung angezeigt, die die Adresse der lokalen Variablen oder der temporären Variablen zurückgibt

Erläuterung: Variable x ist eine lokale Variable. Sein Umfang und seine Lebensdauer liegen innerhalb des Funktionsaufrufs, daher wurde ptr nach der Rückgabe der Adresse der x-Variablen x tot und der Zeiger zeigt immer noch auf diesen Ort.

Lösung dieses Problems: Stellen Sie sicher, dass die Variable x eine statische Variable ist. Mit anderen Worten können wir sagen, dass ein Zeiger, dessen Zeigeobjekt gelöscht wurde, als baumelnder Zeiger bezeichnet wird.

Speicherleck

In der Informatik tritt ein Speicherverlust auf, wenn ein Computerprogramm Speicherzuordnungen falsch verwaltet. Wie einfach haben wir den Speicher zugewiesen und nicht frei andere Sprache Begriff sagen, nicht freigeben Anruf Speicherverlust es ist fatal für die Anwendung und unerwarteten Absturz.

Peter Parker
quelle
3

Mit dem Zeiger können Sie einen benutzerdefinierten Bereich für eine Variable erstellen, die als dynamische Variable bezeichnet wird. Dynamische Variable kann eine einzelne Variable oder eine Gruppe von Variablen desselben Typs ( array) oder eine Gruppe von Variablen unterschiedlichen Typs ( struct) sein. Der Standardbereich für lokale Variablen beginnt, wenn die Steuerung in eine Funktion eintritt, und endet, wenn die Steuerung diese Funktion verlässt. Der standardmäßige globale Vairable-Bereich beginnt bei der Programmausführung und endet nach Beendigung des Programms.

Der Umfang einer dynamischen Variablen, die von einem Zeiger gehalten wird, kann jedoch an jedem Punkt einer Programmausführung beginnen und enden, der von einem Programmierer festgelegt werden muss. Baumeln und Speicherverlust treten nur dann auf, wenn ein Programmierer das Ende des Gültigkeitsbereichs nicht bewältigt.

Ein Speicherverlust tritt auf, wenn ein Programmierer den Code ( freedes Zeigers) für das Ende des Bereichs für dynamische Variablen nicht schreibt . Sobald das Programm den vollständigen Prozessspeicher beendet, wird auf diese Weise auch dieser durchgesickerte Speicher freigegeben. Aber es wird ein sehr ernstes Problem für einen Prozess verursachen, der lange läuft.

Sobald der Bereich der dynamischen Variablen abgelaufen ist (freigegeben), NULLsollte er der Zeigervariable zugewiesen werden. Andernfalls tritt ein undefiniertes Verhalten auf, wenn der Code falsch auf ihn zugreift. Der baumelnde Zeiger ist also nichts anderes als ein Zeiger, der auf eine dynamische Variable zeigt, deren Gültigkeitsbereich bereits abgeschlossen ist.

Rashok
quelle
3

Speicherverlust : Wenn sich in einem Heap ein Speicherbereich befindet, der Stapel jedoch keine Variable enthält, die auf diesen Speicher verweist.

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

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

myarea=newarea;

Dangling-Zeiger : Wenn eine Zeigervariable in einem Stapel, aber kein Speicher im Heap.

char *p =NULL;

Ein baumelnder Zeiger, der versucht, eine Dereferenzierung durchzuführen, ohne Speicherplatz zuzuweisen, führt zu einem Segmentierungsfehler.

user2264571
quelle
3
Ihr Beispiel für einen baumelnden Zeiger ist nicht wirklich ein baumelnder Zeiger, sondern ein NULL-Zeiger. Das richtige Beispiel wäre, dem Zeiger dynamisch Speicher zuzuweisen, beispielsweise mit malloc (), und dann diesen Speicher freizugeben (). Dies macht ihn zu einem baumelnden Zeiger. HINWEIS: Nach dem Freigeben haben wir es nicht NULL zugewiesen, daher zeigt der Zeiger immer noch auf dieselbe Speicheradresse, was ihn zu einem baumelnden Zeiger macht. Wenn Sie nun versuchen, mit demselben Zeiger auf diesen Speicher zuzugreifen (dh den Zeiger zu dereferenzieren), wird möglicherweise kein Segmentierungsfehler mehr angezeigt.
Sactiw
0

Ein Zeiger, der auf einen Speicherort zeigt, der gelöscht (oder freigegeben) wurde, wird als baumelnder Zeiger bezeichnet.

#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); 
 }

Für weitere Informationen klicken Sie HIER

Niravdas
quelle
0

Ein Zeiger, der auf einen Speicherort zeigt, der gelöscht (oder freigegeben) wurde, wird als baumelnder Zeiger bezeichnet. Es gibt drei verschiedene Möglichkeiten, wie der Zeiger als baumelnder Zeiger fungiert.

  1. Speicherzuweisung aufheben
  2. Funktionsaufruf
  3. Variable verlässt den Gültigkeitsbereich

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

Lalit
quelle