? Um estouro de pilha ocorre quando a pilha , uma estrutura de dados crítica encontrada em cada programa em execução , ultrapassa seus limites de memória. Esta condição tem várias causas , todos os sintomas de erros de programação . Se o erro ocorrer em um programa de fonte comercial ou aberto , entre em contato de suporte técnico . Se o problema ocorrer ao testar seu próprio código, aqui estão alguns dos problemas mais comuns que podem ter ocorrido na linha 42. Background Fotografia de
A pilha de chamadas , a causa mais comum de estouros de pilha , tem uma lista de endereços de retorno de cada função ou chamada de método . Quando o programa começa , a pilha de chamadas estiver vazia, quando a primeira função é chamada , o endereço da linha imediatamente após a chamada de função é empurrado na pilha. Quando a função for concluída, o endereço de retorno fica retirado da pilha ea execução continua neste endereço. A pilha expande e colapsa , dependendo do número de chamadas de funções aninhadas.
Recursão
recursão ocorre quando uma função chama a si mesma . Considere o seguinte código:
countNodes Função (nó ) Para cada childNode em nodenodeCount + = 1countNodes ( childNode ) nextEnd função
Usando algum tipo de estrutura de árvore como um documento XML, este código de conta o número de nós de árvore encontrado em um determinado nó . Cada nó filho fica contado , então ele é passado para a mesma função para contar os seus próprios nós filho. Isso continua até que uma criança não tem filhos
Suponha que o nó programador digitado em vez de nó filho da seguinte forma: .
CountNodes Função (nó ) Para cada childNode em nodenodeCount + = 1countNodes (Node ) nextEnd
função
neste caso, a função irá chamar-se por tempo indeterminado e um estouro de pilha ocorre .
Invisível recursão
na maioria dos casos , os desenvolvedores não são intencionalmente escrever código recursiva , mas a recursividade pode ocorrer de maneiras mais sutis. Considere estas três funções:
loadAccount Function ( ) LoadMainAccount ( ) loadTransactions () função Fim
loadMainAccount function () loadAssociatedAccounts () função final
loadAssociatedAccounts função ( ) loadAccount ( ) end função
neste caso , a recursão ocorre indiretamente quando uma função chama outra função que, inadvertidamente, chama a primeira função . O resultado pode demorar um pouco mais , mas o resultado é um estouro de pilha .
Grande Parâmetros
Além rastrear pontos de retorno de chamada de função , a pilha também pode realizar outros dados . A maioria das linguagens usam a pilha para manter os parâmetros da função e estes são geralmente apenas ponteiros de endereço dos locais de parâmetros. Algumas línguas empurrar parâmetros por valor na pilha e isso pode demorar muito mais espaço. O tamanho da pilha padrão para a maioria das línguas variam de 512K para 1MB , por isso, grandes parâmetros passados por valor pode ocasionalmente causar um estouro de pilha. Se houver uma necessidade de passar grandes parâmetros por valor, consulte o manual de referência da linguagem para determinar como aumentar a pilha de variáveis.
Instância
variáveis
instância são aqueles embutidos dentro da função . Por exemplo :
amostra Function ( ) N = getCounter ( ) Retornar n * função 12End
A variável n é uma variável de instância , uma vez que só existe enquanto a amostra de função executa . Em muitas línguas , n é empurrado para a pilha , em seguida, bateu fora quando a função termina. Isso funciona bem para as variáveis simples, como inteiros e caracteres , mas pode encher a pilha quando grandes vetores são usados. Quando isso se torna um problema, considerar o uso de estruturas de dados embutidos, como cordas ou listas. Estas estruturas normalmente alocar memória na pilha , uma área de memória separado muito maior.