Przepełnienie stosu
Z Wikipedii
Przepełnienie stosu - w oprogramowaniu komputerowym występuje, gdy rozmiar stosu wywołań przekroczy ilość pamięci zarezerowanej dla niego. Maksymalny rozmiar stosu jest zwykle ograniczony i ustalany na początku działania programu i zależy od języka programowania, komputera i ilości dostępnej pamięci, najczęściej jest rzędu 1 MB. Skutkiem przepełnienia stosu, gdy nie przygotowano programu na tą okoliczność jest nagłe przerwanie jego działania. Do przepełnienia stosu dochodzi gdy wywoływane jest zbyt wiele funkcji (które ciągle wywołują kolejne) albo gdy funkcja potrzebuje zbyt wiele pamięci na zmienne lokalne.
Najczęstszą przyczyną przepełniania stosu jest nieskończona rekurencja. Gdy przeprowadzona jest optymalizacja rekurencji ogonowej nieskończona rekurencja może zaistnieć bez przepełnienia stosu, bo kolejne wywołania tej funkcji nie zajmują dodatkowego miejsca na stosie.
Inną przyczyną przepełnienia stosu jest próba stworzenia dużej tablicy na stosie. Rozwiązaniem jest zwykle przydzielanie pamięci dynamicznie.
[edytuj] Przykłady w C/C++
- Nieskończona rekurencja
void foo() { bar(); } void bar() { foo(); }
foo()
wywołuje bar()
, który z kolei wywołuje foo()
i tak dalej. W końcu dochodzi do przepełnienia stosu.
- Alokacja dużej tablicy na stosie
void main() { int n[10000000]; // tablica jest zbyt duża int j =0; // j nie mieści się już na stosie, błąd }
[edytuj] Zobacz też
- Przepełnienie bufora
- Stos wywołań