Heap Memory in C Programming
sempre que uma chamada para malloc é feita, a memória é atribuída a partir de algo chamado de heap. Onde exactamente está o heap. Eu sei que um programa na memória principal é dividido em segmento de instrução onde as instruções do programa são presentes, segmento de dados onde os dados globais residem e stack segmento onde as variáveis locais e os parâmetros de função correspondentes são armazenados. E o heap?
4 answers
O heap faz parte do espaço de endereçamento do seu processo. O heap pode ser cultivado ou encolhido; você o manipula chamando brk(2)
ou sbrk(2)
. Isto é de facto o que malloc(3)
faz.
A alocação do heap é mais conveniente do que a alocação da memória na pilha porque persiste após os retornos da rotina de chamada; assim, você pode chamar uma rotina, digamos funcA()
, para alocar um monte de memória e preenchê-la com alguma coisa; essa memória ainda será válida depois dos retornos de funcA()
. Se funcA()
atribuir a a lista local (na pilha) então, quando funcA()
retorna, a lista de 'on-stack' desaparece.
Uma desvantagem de usar o heap é que se você se esquecer de liberar memória heap-alocado, você pode esgotá-lo. A falha em liberar memória alocada por heap (por exemplo, falhar em memória obtida de free()
) é às vezes chamada de fuga de memória .
Outra boa característica do heap, vs. apenas a atribuição de um array/struct/o que quer que esteja na pilha, é que você obtém um valor de retorno dizendo Se a sua alocação foi bem sucedida; se você tentar alocar uma matriz local na pilha e você terminar, você não obtém um código de erro; tipicamente o seu tópico será simplesmente abortado.
Basicamente, depois da Memória ser consumida pelas necessidades dos programas, o que resta é o Monte. Em C que será a memória disponível para o computador, para máquinas virtuais será menos do que isso.
Mas, esta é a memória que pode ser usada em tempo de execução, pois o seu programa precisa de memória dinamicamente.
Você pode querer olhar para isto para mais informações:
O Monte é o oposto diametralmente oposto da pilha. O heap é uma grande piscina de memória que pode ser usado dinamicamente – também é conhecido como a "loja livre". Esta é a memória que não é gerenciada automaticamente-você tem que alocar explicitamente (usando funções como malloc), e desalocate (por exemplo, livre) a memória. A falha em liberar a memória quando você terminar com ela resultará no que é conhecido como uma fuga de memória-memória que ainda está "sendo usada", e não disponível para outros processo. Ao contrário da pilha, geralmente não há restrições sobre o tamanho do heap (ou as variáveis que ele cria), além do tamanho físico da memória na máquina. Variáveis criadas no heap são acessíveis em qualquer lugar do programa.
E a memória do heap requer que uses ponteiros.Um resumo do Monte:
- o heap é gerido pelo programador, a capacidade de modificá-lo é um pouco sem limites
- Em C, as variáveis são atribuídas e libertadas usando funções como malloc () e free ()
- o Monte é grande, e é geralmente limitado pela memória física disponível
- o heap requer ponteiros para aceder a ele
Crédito ao código craftof
Ao ler isto, isto está realmente para além dos reinos de C. C, não especifica que existe um heap atrás de malloc
; poderia ser facilmente chamado de lista de ligações ; Você está apenas a chamar-lhe um heap por convenção.
O que o padrão garante é que malloc
irá devolver um ponteiro a um objecto que tem duração dinâmica de armazenamento, e o seu heap é apenas um tipo de estrutura de dados que facilita o fornecimento desse tipo de Duração do armazenamento. É a escolha comum. No entanto, os próprios programadores que escreveram o seu heap reconheceram que pode não ser um heap, pelo que não verá nenhuma referência do termo heap em o manual POSIX malloc
por exemplo.
Outras coisas que estão além dos reinos da norma C incluem tais detalhes do Código da máquina binário que já não é o código fonte C após a compilação. Os detalhes do layout, embora típicos, são todos implementação-específica em vez de C-específica.
O heap, ou o que guarda de livros é usado para contabilizar as atribuições, é gerado durante o tempo de execução; como malloc
é chamado, novos itens são (presumivelmente) adicionados a ele e como free
é chamado, novos itens são (novamente, presumivelmente) removidos dele.