Partilhar via


Funções de pilha

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

Uma pilha privada é 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 pelo função GetProcessHeap. Novos aplicativos devem usar as funções de heap em vez das funções globais e locais para essa finalidade.

Não há diferença entre a memória alocada de uma pilha privada e a alocada usando as outras funções de alocação de memória. Para obter uma lista completa de funções, consulte a tabela em Memory Management Functions.

Observação

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

 

A função HeapCreate cria um objeto heap privado a partir 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 a pilha. O tamanho inicial determina o número de páginas de leitura/gravação confirmadas inicialmente alocadas para a pilha. 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 a pilha pode crescer. Páginas adicionais são confirmadas automaticamente a partir desse espaço reservado se as solicitações feitas por HeapAlloc excederem o tamanho atual das páginas confirmadas, supondo que o armazenamento físico para elas esteja disponível. Uma vez que as páginas são confirmadas, elas não são descomprometidas até que o processo seja encerrado ou até que a pilha seja destruída chamando a funçãoHeapDestro.

A memória de um objeto heap privado é acessível apenas ao processo que o criou. Se uma biblioteca de vínculo dinâmico (DLL) cria uma pilha privada, ela faz isso no espaço de endereço do processo que chamou a DLL. Só é acessível a esse processo.

A função HeapAlloc aloca um número especificado de bytes de uma pilha privada e retorna um ponteiro para o bloco alocado. Esse ponteiro pode ser usado no HeapFree, HeapReAlloc, HeapSizee HeapValidate funções.

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 uma pilha privada, ele pode se tornar fragmentado. Os aplicativos que alocam grandes quantidades de memória em vários tamanhos de alocação podem usar o de heap de baixa fragmentação para reduzir a fragmentação de heap.

Um uso possível para as funções de heap é criar um heap privado quando um processo é iniciado, especificando um tamanho inicial suficiente para satisfazer os requisitos de memória do processo. Se a chamada para o função HeapCreate falhar, o processo pode encerrar ou notificar o usuário da falta de memória; Se for bem-sucedido, no entanto, o processo tem a garantia de ter a memória de que precisa.

A memória solicitada pelo HeapCreate pode ou não ser contígua. A memória alocada dentro de uma pilha por HeapAlloc é contígua. Você não deve escrever ou ler a partir da memória em uma pilha, exceto aquela alocada 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 por HeapFree. Depois que a memória é liberada, qualquer informação que possa ter estado nela desaparece para sempre. Se você precisar de informações, não libere memória contendo as informações. Chamadas de função que retornam informações sobre memória (como HeapSize) não podem ser usadas com memória liberada, pois podem retornar dados falsos.

A função HeapDestroy destrói um objeto de heap privado. Ele desconfirma 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