? Ein Stack-Überlauf tritt ein, wenn der Stapel , überschreitet eine kritische Datenstruktur in jedem laufenden Programm gefunden , seinen Speicher Grenzen. Diese Bedingung hat mehrere Ursachen , alle Symptome von Programmierfehlern . Tritt der Fehler in einer kommerziellen oder Open-Source- Programm , kontaktieren Tech - Unterstützung. Tritt das Problem beim Testen Ihrer eigenen Code , sind hier einige der häufigsten Probleme, die in Zeile 42 aufgetreten sein könnten. Hintergrund
Die Call-Stack , die häufigste Ursache von Stack Overflows , enthält eine Liste der Absenderadressen jeder Funktion oder Methode aufrufen . Wenn das Programm beginnt , ist der Call-Stack leer ist, dann , wenn die erste Funktion aufgerufen wird , wird die Adresse der Zeile unmittelbar nach dem Aufruf der Funktion auf dem Stack geschoben wird . Wenn die Funktion abgeschlossen ist, wird die Absenderadresse aus dem Stapel geholt und die Ausführung wird an dieser Adresse . Der Stapel expandiert und kollabiert in Abhängigkeit von der Anzahl der verschachtelten Funktionsaufrufe .
Recursion
Rekursion tritt auf, wenn eine Funktion nennt sich . Betrachten Sie den folgenden Code:
Funktion countNodes ( Knoten ) Für jede childNode in nodenodeCount + = 1countNodes ( childNode ) WeiterEnde Funktion
mit einer Art Baumstruktur wie ein XML-Dokument , zählt dieser Code die Anzahl der Baumknoten unter einem gegebenen Knoten gefunden. Jedes Kind bekommt Knoten gezählt , dann ist es in der gleichen Funktion übergeben wird , um seine eigene Kindknoten zählen. Dies wird fortgesetzt, bis ein Kind hat keine Kinder
Angenommen, der Programmierer typisierten Knoten statt untergeordneten Knoten wie folgt: .
Funktion countNodes ( Knoten ) Für jede childNode in nodenodeCount + = 1countNodes (Node ) WeiterEnde Funktion
In diesem Fall wird die Funktion selbst auf unbestimmte Zeit anrufen und einen Stack-Überlauf auftritt.
Versteckte Recursion
In den meisten Fällen , Entwickler sind nicht explizit schriftlich rekursiven Code, aber Rekursion kann in subtiler Weise erfolgen. Betrachten Sie diese drei Funktionen:
Funktion loadAccount () LoadMainAccount () loadTransactions () End Function Funktion
loadMainAccount () loadAssociatedAccounts () end function
Funktion loadAssociatedAccounts () loadAccount ( ) end function
In diesem Fall tritt Rekursion indirekt , wenn eine Funktion eine andere Funktion aufruft , die versehentlich die erste Funktion aufruft . Das Ergebnis kann ein wenig länger dauern , aber das Ergebnis ist ein Stack-Überlauf .
Large Parameter
Neben Tracking-Funktion Anruf Umkehrpunkte der Stapel kann auch halten andere Daten . Die meisten Sprachen verwenden den Stapel Funktionsparameter halten und diese werden in der Regel nur Adreßzeiger der Parameter Standorten. Manche Sprachen drücken Parameter als Wert auf dem Stapel , und dies kann deutlich mehr Platz nehmen . Die Standard-Stack- Größe für die meisten Sprachen reichen von 512K bis 1MB, könnte so groß Parameter als Wert übergeben gelegentlich zu einem Stack-Überlauf . Wenn es eine Notwendigkeit, große Parameter als Wert übergeben , wenden die Sprache Anleitung, um zu bestimmen, wie die Stapel zu erhöhen.
Instanzvariablen
Instanzvariablen werden diejenigen eingebettet innerhalb der Funktion . Zum Beispiel:
Funktion Probe ( ) N = getCounter () Return n * 12end Funktion
Die Variable n ist eine Instanzvariable seit sie existiert nur , solange die Funktion Probe führt . In vielen Sprachen wird n auf dem Stapel abgelegt , dann aus, wenn die Funktion beendet aufgetaucht. Dies funktioniert gut für einfache Variablen wie Zahlen und Zeichen , kann aber den Stapel zu füllen, wenn große Arrays verwendet werden. Wenn dies zu einem Problem wird , sollten Sie eingebaute Datenstrukturen wie Strings oder Listen . Diese Strukturen meist Speicherzuweisung auf dem Heap , ein separates , viel größeren Speicherbereich .