stivă de preaplin

Preaplinul software-ul stivă (Engl. Stack Overflow) are loc atunci când este depozitat în stiva de apel mai multe date decât poate deține. De obicei, capacitate stiva este setat la pornirea programului / flux. Când indicatorul stivă merge dincolo de accidente de program. [1]

Această eroare apare din trei motive. [2]

Cel mai simplu exemplu de recursie infinit în C:

Funcția se va apela, consumatoare de spațiu pe stivă în timp ce stiva nu este completă și nu se va întâmpla vina segmentare. [3]

Acesta este un exemplu rafinat, în cod real, poate să apară recursivitate infinit din două motive:

Ea nu a funcționat starea de ieșire a recurență

O cauză comună de depășire stivă - atunci când, în anumite circumstanțe extreme, starea de terminare a recursivitate netestat nu funcționează.

Programul va merge într-un recursie infinit atunci când n negativ.

Multe limbi face optimizare, denumit în continuare „recursivitate coadă“. Recursie, situat la capătul funcției, este transformată într-o buclă și nu consumă stiva [4]. În cazul în care acest lucru de optimizare, în loc de o stivă de preaplin va bucla.

Programator scris recursivitate, nerealizand

Programatorul poate scrie un recursie și neintenționat - de exemplu, în cazul în care aceeași funcționalitate efectua mai multe funcții supraîncărcate, iar una cauzează cealaltă.

Cadrele de interfață, cum ar fi Qt și VCL recursie pot apărea în cazul în care handler, de exemplu, schimbări în domeniul programator însuși acest domeniu și schimbare.

recursivitate foarte profunde

acest cod poate distruge lista legată:

Acest algoritm, în cazul în care lista nu este rasfatat, teoretic, să fie executată într-un timp finit, prin solicitarea cu O (n) din stivă. Desigur, în lista lungă a programului nu reușește. Soluții posibile:

  • Pentru a găsi un algoritm non-recursiv (lucrări de mare în acest exemplu).
  • Sistemul de transfer de stivă recursie alocate dinamic (de exemplu, atunci când traversează diferite tipuri de rețele [5]).
  • Dacă recursie este plecat departe, utilizați o altă metodă. De exemplu, sortarea rapidă - metoda de sortare extrem de eficient, care, în cazuri extreme, poate implica o cantitate considerabilă din stivă. Prin urmare, punerea în aplicare a fel în limbaje de programare a limita adâncimea de recursie, iar în cazul în care „odihnit“, în limita, folosind metode mai lente, cum ar fi o piramidă. Acesta este modul în care, de exemplu, Introsort.

Variabilele mari pe stivă

Matrice este de 8 MB de memorie; în cazul în care stiva este nici o astfel de cantitate de preaplin de memorie se întâmplă.

Orice lucru care reduce dimensiunea efectivă stivă crește riscul de preaplin. De exemplu, fluxurile de obicei iau stiva este mai mică decât programul principal - astfel încât programul poate rula în singur filetate și Multithreaded neagă. Rularea în nucleu rutine folosiți modul de multe ori stiva altor oameni, astfel încât atunci când programarea în modul kernel încearcă să nu folosească Recursivitate și variabile locale mari. [7] [8]