Vitajte na [www.pocitac.win] Pripojiť k domovskej stránke Obľúbené stránky

Domáce Hardware Siete Programovanie Softvér Otázka Systémy

Čo je pretečeniu zásobníka na riadku 42 ?

Pretečenie zásobníku dochádza , keď zásobník , kritické štruktúry dát nájdete v každom spusteného programu , prekračuje svoje hranice pamäti . Tento stav má niekoľko príčin , všetky príznaky programových chýb . Pokiaľ dôjde k chybe v obchodnom alebo open source program , obráťte sa na tech - support . Ak sa problém vyskytuje pri testovaní vlastného kódu , tu sú niektoré z najčastejších otázok , ktoré môžu mať , ku ktorým došlo na riadku 42. Pozadia

zásobník volaní , najčastejšou príčinou pretečeniu zásobníka , má zoznam návratových adries pre jednotlivé funkcie alebo volanie metódy . Keď začne program , zásobník volaní je prázdny , a potom , keď sa prvýkrát volaná funkcia , adresa riadku bezprostredne po volaní funkcie dostane tlačil na zásobníku . Ak funkcia skončí , spiatočná adresa dostane vyskočila z kôpky a vykonávanie pokračuje na tejto adrese . Zásobník rozširuje a zrúti sa v závislosti na počte vnorených volaní funkcií .
Rekurzia

rekurzia nastáva , keď funkcia volá seba . Zoberme si nasledujúci kód : Spojené

Funkčné countNodes ( uzlov ) pre každú childNode v nodenodeCount + = 1countNodes ( childNode ) DalšíKonec funkcie klipart

Použitie nejakú stromovú štruktúru ako XML dokumentu , tento kód sa počíta počet uzlov stromu nájdených v rámci daného uzla . Každé dieťa uzol dostane počíta , potom je odovzdaný do rovnakej funkcie počítať svoje podriadené uzly . Tento postup sa opakuje , až kým dieťa nemá žiadne deti

Predpokladajme , že programátor napísal uzol namiesto podriadený uzol takto : .

Funkcia countNodes ( uzol ) pre každú childNode v nodenodeCount + = 1countNodes ( Node ) DalšíKonec funkcie

V tomto prípade bude funkcia volať donekonečna a pretečenie zásobníka dochádza .
Skrytá Rekurzia

Vo väčšine prípadov , vývojári nie sú zámerne písať rekurzívne kódu , ale rekurzia môže dôjsť v jemnejších spôsobov . Zoberme si tieto tri funkcie :

Funkcia loadAccount ( ) LoadMainAccount ( ) loadTransactions ( ) End funkcie

Funkcia loadMainAccount ( ) loadAssociatedAccounts ( ) end funkcie

funkcie loadAssociatedAccounts ( ) loadAccount ( ) end funkcie celým

V tomto prípade , rekurzia dochádza nepriamo , keď funkcia volá inú funkciu , ktorá volá nechtiac prvú funkciu . Výsledkom môže trvať trochu dlhšie , ale výsledkom je pretečenie zásobníka .
Veľké Parametre

Okrem sledovania funkcie volania , návratové body , zásobník môže tiež držať iné dáta . Väčšina jazyky používajú zásobník držať parametre funkcií a títo sú zvyčajne len ukazovatele adresa lokalít parametrov . Niektoré jazyky tlačiť parametrov hodnotou na zásobníku , a to môže trvať podstatne viac miesta . Predvolenú veľkosť zásobníka pre väčšinu jazykov v rozmedzí od 512 kB do 1 MB , takže veľké parametre odovzdávané hodnotou mohla občas spôsobiť pretečenie zásobníka . Ak je potreba prejsť veľké parametrov hodnotou , obráťte sa na referenčnú príručku jazyka zistiť , ako zvýšiť stack premenné .
Instance

Premenné inštancie sú tie vložené vnútri funkcie . Napríklad :

Funkčná vzorka ( ) N = getCounter ( ) Return n * 12End funkcia

Premenná n je premenná inštancie , pretože existuje iba , keď vzorka funkcie vykonáva . V mnohých jazykoch , n dostane tlačil do zásobníka , potom vyskočila off , kedy funkcia ukončí . To funguje dobre pre jednoduché premenné , ako sú celé čísla a znaky , ale môže naplniť zásobník pri použití veľké pole . Keď sa to stane problém , zvážte použitie vstavané dátové štruktúry , ako sú reťazce alebo zoznamy . Tieto štruktúry sa zvyčajne alokovať pamäť na halde , samostatný , oveľa väčšie oblasti pamäte .

Najnovšie články

Copyright © počítačové znalosti Všetky práva vyhradené