O que é um heap de memória?


174

O que é um monte de memória?

Respostas:


234

Presumivelmente, você quer dizer heap do ponto de vista da alocação de memória, não do ponto de vista da estrutura de dados (o termo tem vários significados).

Uma explicação muito simples é que o heap é a parte da memória em que reside a memória alocada dinamicamente (ou seja, a memória alocada via malloc). A memória alocada do heap permanecerá alocada até que ocorra uma das seguintes situações:

  1. A memória é freed
  2. O programa termina

Se todas as referências à memória alocada forem perdidas (por exemplo, você não armazena mais um ponteiro), você tem o que é chamado de vazamento de memória . É aqui que a memória ainda foi alocada, mas você não tem mais como acessá-la. A memória vazada não pode ser recuperada para alocações de memória futuras, mas quando o programa termina, a memória será liberada pelo sistema operacional.

Compare isso com a memória da pilha, que é onde vivem as variáveis ​​locais (aquelas definidas em um método). A memória alocada na pilha geralmente só dura até que a função retorne (existem algumas exceções a isso, por exemplo, variáveis ​​locais estáticas).

Você pode encontrar mais informações sobre o heap neste artigo .


3
Como as variáveis ​​locais poderiam viver em uma pilha? Uma pilha apenas permite pegar uma variável de cada vez em uma ordem muito específica. E se eu precisar de uma variável local de algum lugar mais baixo da pilha?
CodyBugstein

9
@Imray - em um idioma estaticamente digitado, os tamanhos dos parâmetros locais são conhecidos em tempo de compilação. Portanto, as variáveis ​​locais podem simplesmente ser acessadas diretamente da pilha através de um deslocamento de endereço. Não há necessidade de abrir a pilha para fazer isso. Veja esta resposta para mais detalhes.
precisa saber é o seguinte

17

Um heap de memória é um local na memória em que a memória pode ser alocada em acesso aleatório.
Diferentemente da pilha em que a memória é alocada e liberada em uma ordem muito definida, os elementos de dados individuais alocados no heap geralmente são liberados de maneira assíncrona. Qualquer elemento de dado é liberado quando o programa libera explicitamente o ponteiro correspondente, e isso pode resultar em um heap fragmentado. Em oposição, apenas os dados na parte superior (ou na parte inferior, dependendo da maneira como a pilha funciona) podem ser liberados, resultando na liberação do elemento de dados na ordem inversa em que foram alocados.


9

Heap é apenas uma área em que a memória é alocada ou desalocada sem qualquer ordem. Isso acontece quando se cria um objeto usando o newoperador ou algo semelhante. Isso se opõe à pilha, onde a memória é desalocada na base da primeira a sair pela última vez.


8

Um heap de memória é uma estrutura comum para armazenar memória alocada dinamicamente. Consulte Dynamic_memory_allocation na wikipedia.

Existem outras estruturas, como piscinas, pilhas e pilhas.


7

É um pedaço de memória alocado do sistema operacional pelo gerenciador de memória em uso por um processo. As chamadas para malloc()et alia tiram memória desse heap em vez de precisar lidar diretamente com o sistema operacional.


7

Você provavelmente quer dizer memória de pilha, não pilha de memória.

A memória heap é essencialmente um grande conjunto de memória (geralmente por processo) do qual o programa em execução pode solicitar partes. Isso geralmente é chamado de alocação dinâmica .

É diferente da pilha, onde "variáveis ​​automáticas" são alocadas. Assim, por exemplo, quando você define em uma função C uma variável de ponteiro, espaço suficiente para armazenar um endereço de memória é alocado na pilha. No entanto, muitas vezes você precisará alocar espaço dinamicamente (com malloc) na pilha e fornecer o endereço onde esse pedaço de memória começa no ponteiro.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.