Vitajte na [www.pocitac.win] Pripojiť k domovskej stránke Obľúbené stránky
Tu je návod, ako to riešiť a potenciálne to napraviť:
1. Identifikujte vinu:
* nekonečná rekurzia: Najbežnejšou príčinou je nekonečné rekurzívne funkčné volanie. Rekurzívna funkcia sa nazýva bez správneho základného prípadu (stav, ktorý zastaví rekurziu). Starostlivo skontrolujte všetky vaše rekurzívne funkcie, aby ste sa uistili, že majú dobre definovaný základný prípad, ktorý nakoniec ukončí rekurziu.
* hlboko vnorené funkčné hovory: Dokonca aj bez rekurzie môže zásobník vyčerpať veľmi veľký počet vnorených funkčných hovorov. Pokúste sa refaktorovať svoj kód, aby ste znížili hĺbku hniezdenia. Zvážte rozdelenie veľkých funkcií na menšie, zvládnuteľnejšie.
* Veľké miestne premenné: Vyhlásenie veľmi veľkých polí alebo iných dátových štruktúr, pretože miestne premenné v rámci funkcií môžu spotrebovať významný priestor zásobníka. Zvážte použitie dynamickej alokácie pamäte (napr. Použitie `dim` s` remim` pre polia alebo objekty, ktoré môžu rásť vo veľkosti) alebo odovzdávanie týchto veľkých štruktúr ako argumentov namiesto ich vytvárania lokálne v rámci každej funkcie.
* Veľké dátové štruktúry v zásobníku: Vyvarujte sa príliš veľkému dátovým štruktúram priamo do zásobníka. Zvážte použitie dynamickej alokácie pamäte (halda) namiesto toho, aby ste použili `new` pre objekty alebo` dim` s `remim`, aby ste ich pridelili na haldu.
2. Stratégie ladenia:
* debugger: Na prejdenie riadku s kódom používajte debugger (napríklad ten integrovaný do IDE VB6). Venujte veľkú pozornosť zásobníkovi hovorov, ktorý ukazuje postupnosť funkčných hovorov. Pomôže to určiť miesto, kde dôjde k pretečeniu zásobníka. Samotná chybová správa (00404302) poskytuje adresu pamäte; Aj keď nie je priamo užitočné samostatne, je rozhodujúce nájsť to, čo v tomto bode v tomto bode je v tomto bode.
* Zjednodušte: Skúste komentovať časti vášho kódu, aby ste izolovali problémovú oblasť. Ak máte veľkú a komplexnú funkciu, skúste ju zjednodušiť alebo ju rozdeliť na menšie časti.
* Zvýšiť veľkosť zásobníka (najmenej odporúčané): Mohol by ste * skúsiť zväčšiť veľkosť zásobníka pridelenej do vašej aplikácie VB6. Vo všeobecnosti to však nie je dobré riešenie, pretože maskuje iba základný problém. Skutočné riešenie zahŕňa riešenie hlavnej príčiny nadmerného využitia zásobníka. Metóda na zväčšenie veľkosti zásobníka závisí od vášho operačného systému a od toho, ako prevádzkujete aplikáciu VB6 (napr. Prostredníctvom IDE alebo spustiteľného súboru). Často sa dosahuje prostredníctvom nastavení linkerov operačného systému alebo premenných prostredia prostredia (pozrite si dokumentáciu vášho OS).
3. Príklad nekonečnej rekurzie:
`` `vb.net
Súkromné subfininiteRerecursion ()
InfiniteReCursion 'To spôsobí pretečenie zásobníka!
Koncový
`` `
Opravená verzia:
`` `vb.net
Súkromná rekurzná funkcia (ByVal n ako celé číslo)
Ak n> 0 potom
Rekurzívna funkcia (n - 1) „Základný prípad:Zastavuje sa, keď n sa stane 0
Skončiť
Koncový
`` `
Systematickým preskúmaním týchto bodov a použitím techník ladenia by ste mali byť schopní nájsť a opraviť príčinu chyby pretečenia zásobníka. Pamätajte, že vyriešenie základného problému - nedokončená rekurzia alebo nadmerné využitie zásobníka - je oveľa lepšie ako jednoduché zväčšenie veľkosti zásobníka. Zvýšenie veľkosti zásobníka iba odkladá nevyhnutná havária, ak sa koreňová príčina nevyrieši.