Was ist ein Segmentierungsfehler? Ist er in C und C++ unterschiedlich? Wie hängen Segmentierungsfehler und "Dangling Pointer" zusammen?
Antworten
Zu viele Anzeigen?Segmentierungsfehler wird auch durch Hardware-Fehler verursacht, in diesem Fall durch die RAM-Speicher. Dies ist die seltenere Ursache, aber wenn Sie keinen Fehler in Ihrem Code finden, könnte Ihnen vielleicht ein Memtest helfen.
Die Lösung in diesem Fall, ändern Sie den RAM.
bearbeiten:
Hier gibt es einen Hinweis: Segmentierungsfehler durch Hardware
Wikipedia's Segmentierung_Störung Seite hat eine sehr schöne Beschreibung darüber, die nur auf die Ursachen und Gründe hinweist. Eine detaillierte Beschreibung finden Sie im Wiki.
In der Informatik ist ein Segmentierungsfehler (oft abgekürzt als Segfault) oder eine Zugriffsverletzung ein Fehler, der von Hardware mit Speicherschutz ausgelöst wird und ein Betriebssystem über eine Speicherzugriffsverletzung informiert.
Im Folgenden sind einige typische Ursachen für einen Segmentierungsfehler aufgeführt:
- Dereferenzierung von NULL-Zeigern - dies wird von der Speicherverwaltungshardware besonders berücksichtigt
- Versuch des Zugriffs auf eine nicht existierende Speicheradresse (außerhalb des Adressraums des Prozesses)
- Versuch, auf Speicher zuzugreifen, für den das Programm keine Rechte hat (z. B. Kernelstrukturen im Prozesskontext)
- Versuch, schreibgeschützten Speicher (z. B. Codesegment) zu schreiben
Diese wiederum werden oft durch Programmierfehler verursacht, die zu einem ungültigen Speicherzugriff führen:
-
Dereferenzierung oder Zuweisung an einen nicht initialisierten Zeiger (wilder Zeiger, der auf eine beliebige Speicheradresse zeigt)
-
Dereferenzierung oder Zuweisung an einen freigegebenen Zeiger (Dangling Pointer, der auf Speicher zeigt, der freigegeben/freigegeben/gelöscht wurde)
-
Ein Pufferüberlauf.
-
Ein Stapelüberlauf.
-
Versuch, ein Programm auszuführen, das nicht korrekt kompiliert wurde. (Einige Compiler geben trotz Kompilierfehlern eine ausführbare Datei aus.)
Segmentierungsfehler tritt auf, wenn ein Prozess (laufende Instanz eines Programms) versucht, auf eine schreibgeschützte Speicheradresse oder einen Speicherbereich zuzugreifen, der von einem anderen Prozess verwendet wird, oder auf eine nicht existierende (ungültige) Speicheradresse. Dangling Reference (Zeiger) Problem bedeutet, dass der Versuch, auf ein Objekt oder eine Variable zuzugreifen, deren Inhalt bereits aus dem Speicher gelöscht wurde, z. B:
int *arr = new int[20];
delete arr;
cout<<arr[1]; //dangling problem occurs here
Es gibt mehrere gute Erklärungen zu "Segmentierungsfehler" in den Antworten, aber da es bei Segmentierungsfehlern oft einen Speicherauszug des Speicherinhalts gibt, wollte ich mitteilen, wo die Beziehung zwischen dem "core dumped" Teil in Segmentierungsfehler (Core Dumped) und Erinnerung kommt:
Von etwa 1955 bis 1975 - also vor der Zeit der Halbleiterspeicher - war die vorherrschende Technologie für Computerspeicher die Verwendung von winzigen, auf Kupferdrähten aufgezogenen magnetischen Donuts. Die Doughnuts waren als "Ferritkerne" bekannt und der Hauptspeicher daher als "Kernspeicher" oder "Kern".
Entnommen aus aquí .