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:

Veja também

Links da web