Hva er Stack Overflow på linje 42?

En stabel flow oppstår når stabelen, en kritisk datastruktur som finnes i hvert program som kjører, overstiger minnet grenser. Denne tilstanden har flere årsaker, alle symptomer på programmeringsfeil. Hvis feilen oppstår i en kommersiell eller åpen kildekode-program, kontakt tech-support. Hvis problemet oppstår under testing din egen kode, her er noen av de vanligste problemene som kan ha oppstått i linje 42.

Bakgrunn

Samtalen stabelen, er den vanligste årsaken til stack overflow, har en liste over retur adressene til hver funksjon eller metode samtale. Når programmet starter, er anrops stabelen tom, når den første funksjonen blir kalt, adressen til den linje umiddelbart etter funksjonskallet blir skjøvet på stabelen. Når funksjonen er ferdig, blir returadressen popped av stabelen og gjennomføring fortsetter på denne adressen. Stabelen utvider seg og kollapser, avhengig av antall nestede funksjonskall.

rekursjon

Rekursjon oppstår når en funksjon kaller seg. Vurder følgende kode:

Funksjons countNodes (node)
For hver childNode i node

nodeCount += 1
countNodes(childNode)

neste
End-funksjonen

Ved hjelp av en slags trestruktur som et XML-dokument, teller denne koden antall tre noder funnet under en gitt node. Hvert barn node blir talt opp, så det blir gått inn i den samme funksjonen for å telle sine egne barn noder. Dette fortsetter til et barn har ingen barn.

Anta programmerer skrevet node i stedet for barnet node som følger:

Funksjons countNodes (node)
For hver childNode i node

nodeCount += 1
countNodes(Node)

neste
End-funksjonen

I dette tilfelle vil funksjonen kalle seg i det uendelige og en stabel overflyt inntreffer.

skjulte Rekursjon

I de fleste tilfeller, er utviklere ikke med vilje å skrive rekursive kode, men rekursjon kan oppstå i mer subtile måter. Vurdere disse tre funksjonene:

Funksjon loadAccount ()
LoadMainAccount ()
loadTransactions ()

End-funksjonen

Funksjon loadMainAccount ()
loadAssociatedAccounts ()
end funksjon

funksjons loadAssociatedAccounts ()
loadAccount ()
end funksjon

I dette tilfelle skjer rekursjon indirekte når en funksjonskall en annen funksjon som utilsiktet kaller den første funksjon. Resultatet kan ta litt lenger tid, men resultatet er en stakkoverflyt.

store Parametere

I tillegg til sporing funksjon samtale returpunkter, stabelen også kan inneholde andre data. De fleste språk bruker stabelen til å holde funksjonsparametere, og disse er vanligvis bare adresse pekere av parameter steder. Noen språk presse parametere av verdien på stakken, og dette kan ta betydelig mer plass. Standard stack størrelse for de fleste språk varierer fra 512K til 1MB, kunne så store parametere som sendes av verdien av og til føre til en stack overflow. Dersom det er behov for å passere store parametre ved verdi, se språket referansehåndboken for å finne ut hvordan du kan øke stabelen.

instansvariabler

Objektvariabler er de som er innleiret inne i funksjon. For eksempel:

Funksjon prøve ()
N = getCounter ()
Retur n * 12
End-funksjonen

Variabelen n er en instansvariabel siden det bare finnes mens funksjonen prøven utfører. I mange språk, n blir skjøvet inn i bunken, så spratt frem når funksjonen opphører. Dette fungerer fint for enkle variabler som heltall og tegn, men kan fylle ut bunken når store matriser brukes. Når dette blir et problem, bør du vurdere å bruke innebygde datastrukturer som strenger eller lister. Disse strukturene vanligvis allokere minne på haugen, en egen, mye større minneområde.