Unterschied zwischen hängendem Zeiger und Speicherleck

Lesezeit: 5 Minuten

Benutzeravatar des toten Programmierers
toter Programmierer

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

Benutzeravatar von Anirudh Ramanathan
Anirudh Ramanathan

EIN baumelnder Zeiger zeigt auf bereits freigegebenen Speicher. Der Speicher wird nicht mehr zugewiesen. Der Versuch, darauf zuzugreifen, kann einen Segmentierungsfehler verursachen.

Üblicher Weg, um mit einem baumelnden Zeiger zu enden:

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, die eine lokale Variable war, die den Gültigkeitsbereich verlassen hätte, als die Steuerung an die aufrufende Funktion zurückgegeben wurde. (Undefiniertes Verhalten)

Ein weiteres gängiges Beispiel für einen baumelnden Zeiger ist ein Zugriff auf einen Speicherplatz über einen Zeiger, nachdem er frei war ausdrücklich rief diese Erinnerung an.

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

EIN Speicherleck Speicher ist, der nicht freigegeben wurde, gibt es jetzt keine Möglichkeit, darauf zuzugreifen (oder ihn freizugeben), da es keine Möglichkeiten mehr gibt, darauf zuzugreifen. (zB ein Zeiger, der war der einzige Verweis auf einen Speicherort dynamisch zugeteilt (und nicht befreit), was jetzt woanders hindeutet.)

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 zugewiesene Variable verliert 10 Byte.

  • Dieser Artikel könnte auch hilfreich sein stackoverflow.com/questions/127386/…

    – bkausbk

    19. Juli 2013 um 7:43 Uhr

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

Wenn Sie einen Speicherbereich freigeben, aber immer noch 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, haben Sie ein Speicherleck:

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

EIN baumelnder Zeiger ist einer, der einen Wert (nicht NULL) hat, 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, dann überschreiben Sie diesen Speicher mit etwas anderem, das nichts mit ihm zu tun hat, oder geben Sie den Speicher frei, wenn er dynamisch zugewiesen wurde.

EIN Speicherleck ist, wenn Sie Speicher dynamisch vom Heap zuweisen, ihn aber nie freigeben, möglicherweise weil Sie alle Verweise darauf verloren haben.

Sie sind insofern verwandt, als es sich bei beiden um Situationen handelt, die sich auf falsch verwaltete Zeiger beziehen, insbesondere in Bezug auf dynamisch zugewiesenen Speicher. In einer Situation (hängender Zeiger) haben Sie wahrscheinlich den Speicher freigegeben, aber danach versucht, ihn zu referenzieren; im anderen (Speicherleck) haben Sie vergessen, den Speicher vollständig freizugeben!

Benutzeravatar von PeterParker
Peter Parker

Baumelnder Zeiger

Wenn ein Zeiger auf die Speicheradresse einer beliebigen Variablen zeigt, aber nachdem eine Variable aus dieser Speicherstelle gelöscht wurde, während der Zeiger immer noch auf diese Speicherstelle zeigt. Ein solcher Zeiger ist bekannt als baumelnder Zeiger und dieses Problem ist als Dangling-Pointer-Problem 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: Garbage-Wert

Hinweis: In einigen Compilern erhalten Sie möglicherweise eine Warnmeldung, die die Adresse der lokalen oder temporären Variable zurückgibt

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

Lösung dieses Problems: Machen Sie die Variable x zu einer statischen Variable. Mit anderen Worten, wir können sagen, dass ein Zeiger, dessen zeigendes Objekt gelöscht wurde, als baumelnder Zeiger bezeichnet wird.

Speicherleck

In der Informatik tritt ein Speicherleck auf, wenn ein Computerprogramm Speicherzuweisungen falsch verwaltet. Wie pro einfachen haben wir den Speicher zugewiesen und nicht frei. Andere Sprachbegriffe sagen, nicht freigeben, Speicherleck nennen, es ist fatal für die Anwendung und unerwarteter Absturz.

Pointer hilft beim Erstellen eines benutzerdefinierten Bereichs für eine Variable, die als dynamische Variable bezeichnet wird. Dynamische Variable kann eine einzelne Variable oder eine Gruppe von Variablen des gleichen Typs sein (array) oder eine Gruppe von Variablen unterschiedlichen Typs (struct). Der Standardbereich lokaler Variablen beginnt, wenn die Steuerung in eine Funktion eintritt, und endet, wenn die Steuerung aus dieser Funktion herauskommt. Der standardmäßige globale Variablenbereich beginnt bei der Programmausführung und endet, sobald das Programm beendet ist.

Der Umfang einer dynamischen Variablen, die von einem Zeiger gehalten wird, kann jedoch an jedem Punkt in einer Programmausführung beginnen und enden, was von einem Programmierer entschieden werden muss. Dangling und Memory Leak kommen nur dann ins Bild, wenn ein Programmierer das Ende des Bereichs nicht handhabt.

Speicherverlust tritt auf, wenn ein Programmierer den Code nicht schreibt (free des Zeigers) für das Ende des Gültigkeitsbereichs für dynamische Variablen. Auf jeden Fall wird nach dem Beenden des Programms der vollständige Prozessspeicher freigegeben, und zu diesem Zeitpunkt wird auch dieser Speicherverlust freigegeben. Aber es wird ein sehr ernstes Problem für einen Prozess verursachen, der lange Zeit läuft.

Sobald der Gültigkeitsbereich der dynamischen Variablen endet (freigegeben), NULL sollte der Zeigervariablen zugewiesen werden. Andernfalls tritt undefiniertes Verhalten auf, wenn der Code fälschlicherweise darauf zugreift. Dangling Pointer ist also nichts anderes als ein Zeiger, der auf eine dynamische Variable zeigt, deren Gültigkeitsbereich bereits abgeschlossen ist.

Benutzeravatar von drs
drs

Speicherleck: Wenn es einen Speicherbereich in einem Heap gibt, aber keine Variable im Stack auf diesen Speicher zeigt.

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

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

myarea=newarea;

Hängender Zeiger: Wenn eine Zeigervariable in einem Stack, aber kein Speicher im Heap vorhanden ist.

char *p =NULL;

Ein baumelnder Zeiger, der versucht zu dereferenzieren, ohne Platz zuzuweisen, führt zu einem Segmentierungsfehler.

Pangs Benutzeravatar
Stich

Ein Zeiger, der auf einen gelöschten (oder freigegebenen) Speicherplatz zeigt, wird als freier Zeiger bezeichnet. Es gibt drei verschiedene Möglichkeiten, wie Pointer als hängender Zeiger fungiert.

  1. Freigabe des Speichers
  2. Funktionsaufruf
  3. Variable verlässt den Geltungsbereich

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

1419350cookie-checkUnterschied zwischen hängendem Zeiger und Speicherleck

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy