Funções heap

Cada processo tem um heap padrão fornecido pelo sistema. Aplicativos que fazem alocações frequentes do heap podem melhorar o desempenho usando heaps privados.

Um heap privado é um bloco de uma ou mais páginas no espaço de endereço do processo de chamada. Depois de criar o heap privado, o processo usa funções como HeapAlloc e HeapFree para gerenciar a memória nesse heap.

As funções de heap também podem ser usadas para gerenciar a memória no heap padrão do processo, usando o identificador retornado pela função GetProcessHeap . Novos aplicativos devem usar as funções heap em vez das funções globais e locais para essa finalidade.

Não há diferença entre a memória alocada de um heap privado e aquela alocada usando as outras funções de alocação de memória. Para obter uma lista completa de funções, consulte a tabela em Funções de Gerenciamento de Memória.

Observação

Um thread deve chamar funções heap somente para heap padrão do processo e heaps privados que o thread cria e gerencia, usando identificadores retornados pela função GetProcessHeap ou HeapCreate .

 

A função HeapCreate cria um objeto heap privado do qual o processo de chamada pode alocar blocos de memória usando a função HeapAlloc . HeapCreate especifica um tamanho inicial e um tamanho máximo para o heap. O tamanho inicial determina o número de páginas de leitura/gravação confirmadas inicialmente alocadas para o heap. O tamanho máximo determina o número total de páginas reservadas. Essas páginas criam um bloco contíguo no espaço de endereço virtual de um processo no qual o heap pode crescer. Páginas adicionais serão confirmadas automaticamente a partir desse espaço reservado se as solicitações por HeapAlloc excederem o tamanho atual das páginas confirmadas, supondo que o armazenamento físico para ele esteja disponível. Depois que as páginas são confirmadas, elas não são descompactadas até que o processo seja encerrado ou até que o heap seja destruído chamando a função HeapDestroy .

A memória de um objeto de heap privado é acessível somente ao processo que o criou. Se uma DLL (biblioteca de vínculo dinâmico) criar um heap privado, ela o fará no espaço de endereço do processo que chamou a DLL. Ele é acessível apenas para esse processo.

A função HeapAlloc aloca um número especificado de bytes de um heap privado e retorna um ponteiro para o bloco alocado. Esse ponteiro pode ser usado nas funções HeapFree, HeapReAlloc, HeapSize e HeapValidate .

A memória alocada por HeapAlloc não é móvel. O endereço retornado por HeapAlloc é válido até que o bloco de memória seja liberado ou realocado; o bloco de memória não precisa ser bloqueado.

Como o sistema não pode compactar um heap privado, ele pode ficar fragmentado. Aplicativos que alocam grandes quantidades de memória em vários tamanhos de alocação podem usar o heap de baixa fragmentação para reduzir a fragmentação de heap.

Um possível uso para as funções de heap é criar um heap privado quando um processo é iniciado, especificando um tamanho inicial suficiente para atender aos requisitos de memória do processo. Se a chamada para a função HeapCreate falhar, o processo poderá terminar ou notificar o usuário sobre a falta de memória; se for bem-sucedido, no entanto, o processo terá a certeza de ter a memória necessária.

A memória solicitada por HeapCreate pode ou não ser contígua. A memória alocada em um heap por HeapAlloc é contígua. Você não deve gravar ou ler da memória em um heap, exceto que alocado por HeapAlloc, nem deve assumir qualquer relação entre duas áreas de memória alocadas por HeapAlloc.

Você não deve se referir de forma alguma à memória que foi liberada pelo HeapFree. Depois que a memória é liberada, qualquer informação que possa ter estado nela se foi para sempre. Se você precisar de informações, não libere a memória que contém as informações. Chamadas de função que retornam informações sobre memória (como HeapSize) podem não ser usadas com memória liberada, pois podem retornar dados falsos.

A função HeapDestroy destrói um objeto heap privado. Ele confirma e libera todas as páginas do objeto heap e invalida o identificador para o heap.

Comparando métodos de alocação de memória