Memória e problemas de memória
![]() |
Os programas de computador acessam a memória do sistema para processamento. Os humanos utilizam nossa própria memória armazenada para realizar tarefas diárias. Quando um programa de computador tenta acessar uma parte da memória que não existe ou acessar a memória de outra forma da maneira errada (veremos isso mais tarde), ele travará.
Considere o seguinte cenário.
Uma violação de acesso à memória , também chamada de falha de segmentação (ou segfault), ocorre quando o programa tenta acessar um local da memória que não existe ou está inacessível de outra forma. Chamamos isso de tentar acessar um local de memória ilegal. Essa memória não existe ou não temos permissão para tocá-la.
Para entender melhor esse conceito, vamos examinar a própria memória. A memória do programa é composta de segmentos (portanto, a palavra-chave falha de segmentação) ou blocos. Vejamos esses segmentos.
![]() |
A tabela a seguir destaca cada segmento.
Segmento | Descrição |
---|---|
Texto | O segmento de texto inclui as instruções de programação, por exemplo, o código do seu programa |
Dados | Variáveis e matrizes que são definidas quando o programa é compilado / construído, são armazenadas no segmento de dados |
Pilha | É aqui que as variáveis temporárias são armazenadas; aqueles definidos em funções e sub-rotinas do programa |
Heap | As variáveis que têm sua memória alocada durante o tempo de execução são armazenadas aqui. Linguagens como C / C ++ usam uma função chamada malloc para alocar memória; em Fortran é alocar. |
Violações de acesso à memória
Agora que cobrimos os fundamentos da memória e como os programas a usam, podemos voltar ao nosso problema: quando o programa tenta pensar, mas nada acontece.
A falha de segmentação acontecerá se um dos tipos de variáveis listados acima tentar acessar a memória fora do segmento em que está. Também pode acontecer se um segmento for definido como somente leitura. Todos nós já passamos por isso em nossas vidas diárias; tentando copiar ou salvar arquivos e eles são somente leitura. É o mesmo conceito, apenas a MEMÓRIA é somente leitura, e o programa não pode fazer a atualização da variável.
Um dos exemplos mais comuns de erros de memória ocorre com matrizes. Uma matriz é uma variável única que pode conter vários baldes. Pense em uma lista para a lista inicial de um time de beisebol. Terá 9 baldes. Depois de configurar o array em seu programa, haverá consequências se você tentar escrever ou acessar o décimo bloco. Lembre-se: os programas começam a contar em ZERO! Nosso primeiro batedor é o batedor 0, o nono é o batedor 8.
O trecho de código a seguir mostra como esses erros podem ocorrer facilmente porque tentamos fazer referência ao 9º batedor. Temos 9 batedores, certo? Sim, mas se contarmos o primeiro como 0, então 9 está fora do intervalo!
![]() |
Ponteiros , que são variáveis que contêm uma localização de memória em vez de um valor, podem causar violações de acesso à memória. Linguagens como C / C ++ permitem o uso de ponteiros. Uma função (por exemplo, scanf ()) pode ser mal utilizada e tentar apontar para um local de memória que não existe ou é somente leitura.
Prevenção de violações de acesso à memória
Às vezes, os erros ocorrem porque a memória do sistema não está à altura (por exemplo, rodando um jogo enorme em uma máquina Windows antiga). No entanto, muitas ferramentas de programação têm opções para detectar esses erros. Os depuradores podem ser usados para ajudá-lo a encontrar erros em potencial. Linguagens como Java fornecem sintaxe para detectar erros em potencial e não travar o programa (chamadas de instruções try e catch). Outra boa prática é a verificação documental à moda antiga: avalie cada linha de código cuidadosamente no papel. Às vezes, perdemos coisas que são óbvias na tela do computador.
Resumo da lição
As violações de acesso à memória ocorrem quando um programa tenta atualizar ou acessar um endereço de memória que não existe (ou está inacessível de outra forma). A memória é dividida em segmentos: Quando uma variável tenta acessar ou atualizar a memória fora de seu segmento, ocorrem violações de acesso à memória. Uma violação de acesso comum acontece com arrays: tentar atualizar um intervalo de array que não existe. Ponteiros , variáveis que armazenam endereços de memória, também podem causar erros, pois podem facilmente acabar apontando para endereços que não existem. Depuradores, sintaxe (como try and catch do Java) e orientações de código manuais podem ajudar a prevenir esses erros.