Memória dinâmica
A memória dinâmica também heap (engl. For, heap ',' pile '), memória heap ou espaço heap é uma área de memória da qual, em tempo de execução de um programa, podem ser solicitadas seções de memória contíguas e liberadas em qualquer ordem. O compartilhamento pode ser feito manualmente ou com a ajuda de um coletor de lixo automático . Uma solicitação de memória do heap também é chamada de solicitação de memória dinâmica . É usado pelos programas para ter memória buffer adicional disponível além da memória ocupada pelo próprio código do programa e pelos campos de dados reservados permanentemente e a pilha (memória de pilha) .
O gerenciamento de memória dinâmica significa um esforço adicional considerável para o desenvolvimento de aplicativos e é uma fonte frequente de erros, especialmente para vazamentos de memória . Um erro típico é, por exemplo, que as referências à memória alocada dinamicamente são substituídas involuntariamente e a área originalmente referenciada não pode mais ser liberada. Por outro lado, as referências à memória que já foram liberadas também podem permanecer. Essas referências são conhecidas como ponteiros suspensos .
Diferença para a pilha
Ele difere da pilha porque as seções de memória solicitadas da pilha devem ser liberadas na ordem inversa em que foram solicitadas. Isso restringe a reutilização de áreas da pilha que não são mais necessárias; da mesma forma, uma função deve abandonar suas reivindicações de memória de pilha antes de retornar à função de chamada. A pilha também é conhecida como solicitação automática de memória . O tempo necessário para uma solicitação automática de memória em tempo de execução é geralmente significativamente menor do que para uma solicitação de memória dinâmica. Uma vez que apenas uma pequena área de memória é reservada para a pilha, um encerramento indesejado de programa devido a um estouro de pilha pode ocorrer no caso de uso intensivo devido a solicitações muito grandes ou muitas .
Suporte de requisitos de memória dinâmica em linguagens de programação
As linguagens de programação oferecem suporte aos requisitos de memória dinâmica de maneiras diferentes. No ISO- C , por exemplo, existem as funções malloc () , calloc () e realloc () para esse fim . A memória é então liberada novamente com a função free () .
No ISO- C ++ , além das funções já assumidas do C, existe a opção de solicitar memória dinamicamente com a ajuda de nova ou liberá-la novamente com delete .
Gerenciamento de memória
Em comparação com a pilha, a administração do heap pelo ambiente de tempo de execução é mais complexa. As áreas de memória devem ser solicitadas pelo aplicativo a qualquer momento e liberadas novamente em qualquer ordem. O tamanho das áreas e a hora da solicitação ou liberação são imprevisíveis.
Os seguintes requisitos parcialmente contraditórios são, portanto, colocados no gerenciamento de memória dinâmica :
- Alta velocidade
- Uso eficiente de memória
- Pouco esforço administrativo
Liberar um bloco posteriormente pode resultar em fragmentação externa . Uma coleta de lixo automática pode reunir as áreas de memória livres para que blocos livres maiores fiquem disponíveis.
O gerenciamento de memória dinâmica pode ser inadequado para aplicativos de tempo real , uma vez que tanto o tempo de execução quanto a alocação bem-sucedida devem ser garantidos.
implementação
Várias estruturas de dados são usadas para gerenciar os blocos livres:
- listas vinculadas
- Sistemas de camaradagem
- Estruturas semelhantes a heap
- Árvores de busca