? En stack overflow inträffar när stacken , överstiger en kritisk datastruktur som finns i varje program som körs , dess minne hejd . Detta tillstånd har flera orsaker , alla symptom på programmeringsfel . Om fel uppstår i en kommersiell eller open source program , kontakta tech-support . Om problemet uppstår när du testar din egen kod , här är några av de vanligaste frågorna som kan ha inträffat på rad 42 . Bakgrund
Anropsstacken , den vanligaste orsaken till stackspill , har en lista på returen adresser för varje funktion eller metodanrop . När programmet startar , är samtalet stacken tom , sedan när den första funktionen anropas , adressen till raden direkt efter funktionsanropet får skjuts på stacken . När funktionen är klar , blir avsändaradressen poppade av stapeln och exekvering fortsätter på denna adress . Stapeln expanderar och kollapsar beroende på antalet kapslade funktionsanrop.
Rekursion
rekursion inträffar när en funktion kallar sig . Betrakta följande kod :
Funktion countNodes ( nod ) För varje childNode i nodenodeCount + = 1countNodes ( childNode ) NästaSlut funktionen
använda någon form av trädstruktur som ett XML-dokument , räknar denna kod antal trädnoder finns under en viss nod . Varje barn nod får räknas , så det får skickas in samma funktion för att räkna sina egna underordnade noder . Detta fortsätter tills barnet har inga barn
Antag programmeraren skrivit noden i stället för barn nod enligt följande : .
Funktion countNodes ( nod ) För varje childNode i nodenodeCount + = 1countNodes ( Node ) NästaSlut funktion
i detta fall kommer funktionen kalla sig på obestämd tid och en stack overflow inträffar .
Dold rekursion
i de flesta fall , utvecklare inte avsiktligt skriver rekursiv kod , men rekursion kan förekomma på mer subtila sätt . Anser att dessa tre funktioner :
Funktion loadAccount ( ) LoadMainAccount ( ) loadTransactions ( ) End Function
Function loadMainAccount ( ) loadAssociatedAccounts ( ) End Function
funktionen loadAssociatedAccounts ( ) loadAccount ( ) end Function
i detta fall förekommer rekursion indirekt när en funktion anropar en annan funktion som oavsiktligt anropar först funktionen . Resultatet kan ta lite längre tid , men resultatet är en stack overflow .
Stora Parametrar
Förutom spårning återgång larmknappar , stapeln även kan inneha andra uppgifter . De flesta språk använder stacken för att hålla funktionsparametrar och dessa är oftast bara hantera pekare av parametern platser . Vissa språk driva parametrar med värde på stacken och det kan ta betydligt mer utrymme . Standardinställningen stack storlek för de flesta språk varierar från 512K till 1MB , kunde så stora parametrar passerade värde ibland orsaka en stack overflow . Om det finns ett behov av att passera stora parametrar med värde , konsultera manualen språkreferensen att avgöra hur man kan öka stacken .
Instansvariabler
Instansvariabler är de inbäddade inuti funktionen . Till exempel :
Funktion prov ( ) N = getCounter ( ) Avkastning n * 12End funktion
variabeln n är en instans variabel eftersom den endast existerar medan funktionen provet körs . I många språk , blir n skjuts på stacken , sedan dök upp när funktionen avslutas . Detta fungerar bra för enkla variabler som heltal och tecken , men kan fylla stacken när stora arrayer används . När detta blir ett problem , överväga att använda inbyggda datastrukturer som strängar eller listor . Dessa strukturer allokera oftast minne på högen , en separat , större minne område .