Een stack overflow treedt op wanneer de stapel , een kritische data structuur gevonden in elk lopend programma , hoger is dan zijn geheugen grenzen . Deze voorwaarde heeft verschillende oorzaken , allemaal symptomen van programmeerfouten . Als de fout optreedt in een commerciële of open source programma , contact met tech - support . Als het probleem zich voordoet tijdens het testen van uw eigen code , hier zijn een paar van de meest voorkomende problemen die zich hebben voorgedaan op lijn 42 . Achtergrond | De call stack , de meest voorkomende oorzaak van stack overflows , houdt een lijst bij van de terugkeer adressen van elke functie of methode. Wanneer het programma begint , de call stack leeg is , dan wanneer de eerste functie wordt aangeroepen , het adres van de lijn direct na de functie oproep op de stack wordt geduwd . Wanneer de functie is voltooid , wordt het retouradres popped uit de stack en de uitvoering verder op dit adres . De stack uit en stort afhankelijk van het aantal geneste functie oproepen . Recursion Recursion treedt op wanneer een functie noemt zichzelf . Beschouw de volgende code : Functie countNodes ( knooppunt ) Voor elke childNode in nodenodeCount + = 1countNodes ( childNode ) VolgendeEinde functie Met een soort boomstructuur zoals een XML-document , deze code telt de aantal knooppunten vinden onder een bepaalde node. Elk kind knooppunt wordt geteld , dan is het wordt doorgegeven in dezelfde functie aan haar eigen kind nodes te tellen . Dit gaat door totdat een kind heeft geen kinderen Stel dat de programmeur getypte knooppunt in plaats van kind knooppunt als volgt : . Functie countNodes ( knooppunt ) Voor elke childNode in nodenodeCount + = 1countNodes ( Node ) VolgendeEinde functie In dit geval zal de functie zelf onbeperkt bellen en een stack overflow optreedt . Verborgen Recursion In de meeste gevallen , ontwikkelaars zijn niet opzettelijk schrijven recursieve code , maar recursie kan voorkomen bij meer subtiele manieren . Beschouw deze drie functies : Functie loadAccount ( ) LoadMainAccount ( ) loadTransactions ( ) End functie Function loadMainAccount ( ) loadAssociatedAccounts ( ) end functie functie loadAssociatedAccounts ( ) loadAccount ( ) end functie In dit geval treedt recursie indirect als een functie roept een functie die de eerste functie onbedoeld oproepen . Het resultaat kan iets langer duren , maar het resultaat is een stack overflow . Grote Parameters Naast tracking-functie oproep terugkeer punten , de stack kan ook andere gegevens bevatten . De meeste talen gebruik maken van de stack naar functie parameters vast te houden en deze zijn meestal alleen maar pakken wijzers van de parameter locaties . Sommige talen drukken parameters van waarde op de stapel en dit kan aanzienlijk meer ruimte innemen . De standaard stack grootte voor de meeste talen variëren van 512K naar 1MB , kon zo groot parameters doorgegeven door de waarde af en toe leiden tot een stack overflow . Als er behoefte is aan grote parameters voorbij waarde , raadpleeg dan de taal handleiding om te bepalen hoe de stapel te verhogen . Aanleg Variabelen aanleg variabelen zijn die ingebed binnen de functie . Bijvoorbeeld : Functie sample ( ) N = getCounter ( ) Return n * 12End functie De variabele n is een instantie variabele omdat het bestaat alleen wanneer de functie steekproef uitvoert . In vele talen , krijgt n op de stack geduwd , vervolgens dook af wanneer de functie wordt beëindigd . Dit werkt prima voor eenvoudige variabelen zoals integers en personages , maar kan de stapel te vullen wanneer grote arrays worden gebruikt . Wanneer dit wordt een probleem , overwegen met behulp van ingebouwde data structuren zoals strings of lijsten . Deze structuren meestal toe te wijzen geheugen op de heap , een aparte , veel groter geheugen gebied .
|