? En stak overflow opstår, når stakken , et kritisk datastruktur findes i hvert kørende program , overskrider sin hukommelse grænser. Denne betingelse har flere årsager , alle symptomer på programmeringsfejl . Hvis fejlen opstår i en kommerciel eller open source program , skal du kontakte tech-support . Hvis problemet opstår, mens teste din egen kode , her er et par af de mest almindelige problemer , der kan have opstod ved linie 42. . Baggrund
kaldstakkens , den mest almindelige årsag til stack overflow , har en liste over afkastet adresser på hver enkelt funktion eller metode opkald . Når programmet starter , kaldstakkens er tom , så når den første funktion bliver kaldt , adressen på den linje umiddelbart efter funktion opkald bliver skubbet på stakken . Når funktionen er færdig , bliver afsenderadressen poppet fra stakken og udførelse fortsætter på denne adresse . Stakken udvider og kollapser afhængigt af antallet af indlejrede funktionskald .
Recursion
Recursion opstår, når en funktion kalder sig selv . Betragt følgende kode :
Funktion countNodes ( node ) For hver childNode i nodenodeCount + = 1countNodes ( childNode ) nextEnd funktion
hjælp af en slags træstruktur som et XML-dokument , denne kode tæller antallet af træet noder fundet under en given node. Hvert barn node bliver talt , så det bliver gået ind den samme funktion til at tælle sine egne underordnede noder. Dette fortsætter, indtil et barn har ingen børn
Antag programmøren maskinskrevne node i stedet for barneknudepunkt som følger: .
Funktion countNodes ( node ) For hver childNode i nodenodeCount + = 1countNodes ( Node ) nextEnd funktionen
i dette tilfælde vil funktionen kalde sig det uendelige, og en stak overflow opstår.
Skjulte Recursion
i de fleste tilfælde , udviklere er ikke med vilje at skrive rekursive kode, men rekursion kan forekomme i mere subtile måder . Overvej disse tre funktioner:
Function loadAccount () LoadMainAccount () loadTransactions ( ) End funktionen
Function loadMainAccount () loadAssociatedAccounts ( ) ende -funktion
funktion loadAssociatedAccounts () loadAccount ( ) ende -funktion
i dette tilfælde rekursion sker indirekte, når en funktion kalder en anden funktion , der uforvarende kalder den første funktion . Resultatet kan tage lidt længere tid , men resultatet er en stak overflow .
Store Parametre
Udover sporing funktion opkald retur punkter stakken også kan have andre data . De fleste sprog bruger stakken til at holde funktions parametre, og disse er som regel bare fat pointers af parameter placeringer. Nogle sprog skubbe parametre i værdi på stakken og det kan tage betydeligt mere plads. Som standard stack størrelse for de fleste sprog spænder fra 512K til 1MB , så kunne store parametre videre efter værdi imellem forårsage en stak overflow . Hvis der er behov for at passere store parametre i værdi , konsultere sproget reference manual til at bestemme , hvordan man kan øge stakken.
Instansvariabler
Instansvariabler er dem indlejret inde i funktion. For eksempel : Hej
Function prøve ( ) N = getCounter () Return n * 12End funktion
variable n er en instans variabel , da den kun eksisterer , mens funktionen prøven henretter . I mange sprog , bliver n skubbes ind i stakken , og derefter dukkede off , når funktionen ophører . Det virker fint for simple variabler som heltal og tegn , men kan fylde stakken når store arrays er brugt. Når dette bliver et problem , overveje at bruge indbyggede datastrukturer som strenge eller lister. Disse strukturer normalt afsætte hukommelse på bunke , en separat, meget større hukommelse område.