Ich verstehe den Unterschied zwischen einem baumelnden Zeiger und einem Speicherverlust nicht. Wie hängen diese beiden Begriffe zusammen?
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 .
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!
quelle
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!
quelle
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
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.
quelle
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 (
free
des 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),
NULL
sollte 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.quelle
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.
quelle
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
quelle
—— von https://www.geeksforgeeks.org/dangling-void-null-wild-pointers/
quelle