? En stack overflow oppstår når bunken , overskrider en kritisk datastruktur finnes i hver kjørende program , dets minne grenser. Denne tilstanden har flere årsaker , alle symptomer på programmeringsfeil . Hvis feilen oppstår i en kommersiell eller open source program , ta kontakt med teknisk support . Hvis problemet oppstår mens testing din egen kode , her er noen av de vanligste problemene som kan ha oppstått på linje 42. . Bakgrunn
Kallstakken , den vanligste årsaken til stack overflow , har en liste over avkastningen adresser til hver funksjon eller metode samtale. Når programmet starter , er samtalen stabelen tom, så når den første funksjonen blir kalt , adressen til linjen umiddelbart etter at funksjonen samtalen blir skjøvet på stakken . Når funksjonen er ferdig, blir avsenderadressen popped av stabelen, og fortsetter å utføre, på denne adressen. Stabelen utvides og minimeres avhengig av antall nestede funksjonskall.
Rekursjon
Rekursjon oppstår når en funksjon kaller seg . Vurdere følgende kode :
Funksjon countNodes ( node ) For hver childNode i nodenodeCount + = 1countNodes ( childNode ) NesteSiste funksjon
Bruke 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 programmereren skrevet node i stedet for barnet node som følger: .
Funksjon countNodes ( node ) For hver childNode i nodenodeCount + = 1countNodes ( Node ) NesteSiste funksjon
i dette tilfellet , vil funksjonen kalle seg på ubestemt tid og en stack overflow oppstår .
Hidden Rekursjon
i de fleste tilfeller , utviklere er ikke med vilje å skrive rekursiv kode , men rekursjon kan oppstå i mer subtile måter . Disse tre funksjoner:
Funksjon loadAccount ( ) LoadMainAccount ( ) loadTransactions ( ) End funksjon
Funksjon loadMainAccount ( ) loadAssociatedAccounts ( ) end funksjon
funksjon loadAssociatedAccounts ( ) loadAccount ( ) end funksjon
i dette tilfellet oppstår rekursjon indirekte når et funksjonskall en annen funksjon som utilsiktet kaller den første funksjon . Resultatet kan ta litt lenger tid , men resultatet er en stack overflow .
Store parametere
tillegg til sporing av funksjon samtale returpunkter , bunken også kan inneholde andre data . De fleste språk bruker bunken for å holde funksjon parametere og disse er vanligvis bare ta pekere til parameter steder . Noen språk presse parametre ved verdi på stakken og dette kan ta betydelig mer plass . Standard stack størrelse for de fleste språk varierer fra 512K til 1MB , så kunne store parametere som sendes av verdi til forårsake en stack overflow . Dersom det er behov for å passere store parametere i verdi , bør språket referansen for å finne ut hvordan du kan øke stabelen .
Instansvariablene
Instansvariabler er de innebygde inne i funksjon . For eksempel : en
Funksjon sample ( ) N = getCounter ( ) Return n * 12End funksjon
variabel n er et instansvariabel siden det kun eksisterer mens funksjonen prøven utfører . På mange språk , blir n skyves på stakken , deretter spratt av 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 .