Hva er Stack Overflow?

En stabel overflyt er en type av programmeringsfeil som oppstår når et program forsøker å tildele mer minne på anropet stabelen enn det som er tilgjengelig. Det er en potensielt alvorlig feil som fører til uakseptable programmet til å krasje, og er vanligvis et resultat av en av to design feil.

The Stack

Stabelen refererer til en del av minnet som brukes for å lagre informasjon om funksjonene til et program. Størrelsene og tekniske detaljer av stabelen vil være variere avhengig av programmeringsspråk, kompilatoren, operativsystem og prosessortype, og disse detaljene er vanligvis skjult fra programmerer i de fleste høyere nivå språk.

eksempel Stack

Betrakt følgende eksempel på pseudokode:

fungere et {

1. call function b.
2. call function c.

}

funksjon b {

1. call function c.
2. Print Spot.

}

funksjon c {

1. Print Run.

}

Siden hver funksjon kan kalle andre funksjoner, finnes bunken for å holde oversikt over hvor i den overordnede funksjonen for å fortsette etter at et barn funksjonen returnerer. Dette eksemplet, hvis stoppet inne funksjon c, kan ha en stabel som ser omtrent slik ut:

A1
---> B1
--------> C1

Siden den første linjen av funksjonen A kaller funksjon B, og den første linjen i funksjon B kaller funksjonen C. Etter funksjon C blir ferdig, vil programmet fortsette opp kjeden, kjører B2 og endelig A2.

Infinite Rekursjon

En stabel flow oppstår når et program prøver å lagre for mye informasjon på stakken. Den vanligste årsaken til en stack overflow er en designfeil som heter uendelig rekursjon. Betrakt følgende eksempel på pseudokode:

funksjon A {

1. call function A.

}

Og den resulterende stabel:

-> A1
---> A1
--------> A1
--------------> A1
(og så videre)

De er kjent med vil gjenkjenne dette som en variant av den uendelig loop, bortsett fra, snarere enn å kjøre for alltid programmering, vil dette programmet slutt konsumere alt minnet på stakken, noe som resulterer i en krasj og en stakkoverflyt feil.

Forebygging

Stack overflow feil oppstår vanligvis når du prøver å implementere rekursive algoritmer, og nøkkelen til å unngå de fleste feil er å sikre at følgende gjelder for alle rekursive implementeringer: den rekursive funksjonen må inneholde en exit tilstand som ikke skaper et lag av rekursjon; og den rekursive funksjonen må være utformet slik at hvert lag av rekursjon tilsettes må bringe funksjonen nærmere utgangstilstand.

Store lokale variabler

En annen, mye sjeldnere årsaken stack overflow feil er erklæringen om store lokale variabler, vanligvis i form av matriser som inneholder hundretusener eller millioner, av elementer. Den enkleste måten å unngå stack overflow i denne situasjonen er å bruke pekere og dynamisk minne allokering for å unngå å erklære dataene på bunken når slike minnekrevende operasjoner er etterlyste.