Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Escolhendo o método de alocação correto
Use as diretrizes a seguir para selecionar a API de alocação de memória apropriada para seu cenário:
| Scenario | API recomendada | Observações |
|---|---|---|
| Alocações de C++ de uso geral | new / std::make_unique / std::make_shared |
Opção padrão para código C++. Usa o heap crt internamente. O RAII garante a limpeza automática. |
| Alocações C de uso geral | malloc / calloc / realloc |
Opção padrão para código C. Portátil entre plataformas. |
| Alocações maiores que ~1 MB ou que exigem controle no nível da página | Virtualalloc | Aloca na granularidade da página (normalmente 4 KB). Use para reservar grandes intervalos de endereços, páginas de proteção ou memória com atributos de proteção específicos (PAGE_READWRITEetc PAGE_EXECUTE_READ.). |
| Muitas alocações pequenas com controle personalizado (por exemplo, alocador de pool) | Heapalloc / Heapcreate | Crie um heap privado para isolamento ou controle de serialização. Use HEAP_NO_SERIALIZE somente se o heap for exclusivamente de thread único. |
| Interoperabilidade COM (memória marshalada) | CoTaskMemAlloc | Necessário quando a memória ultrapassa os limites do apartamento COM. Os stubs gerados por MIDL usam CoTaskMemAlloc/CoTaskMemFree. |
| Código herdado usando memória movevel | Globalalloc / Localalloc | Evite um novo código. Elas adicionam sobrecarga sobre HeapAlloc e existem principalmente para compatibilidade com versões anteriores com operações de área de transferência e determinadas APIs Win32 que exigem elas. |
Importante
Sempre emparelhe as funções de alocação e desalocação corretamente. A memória alocada com HeapAlloc deve ser liberada com HeapFree — não free() ou LocalFree. A combinação de famílias de alocação/desalocação causa corrupção de heap que é difícil de diagnosticar.
Note
VirtualAlloc vs HeapAlloc: VirtualAlloc opera com granularidade de página (no mínimo 4 KB, reservas alinhadas a SYSTEM_INFO.dwAllocationGranularity, normalmente 64 KB). Alocar muitos objetos pequenos com espaço de endereço de resíduos VirtualAlloc. Use HeapAlloc (ou malloc/new) para alocações pequenas e frequentes. Use VirtualAlloc quando precisar reservar grandes regiões de endereço, controlar a proteção de página ou implementar alocadores personalizados.
Comparação detalhada
Veja a seguir uma breve comparação dos vários métodos de alocação de memória:
- Cotaskmemalloc
- Globalalloc
- Heapalloc
- Localalloc
- Malloc
- novo
- Virtualalloc
Embora as funções GlobalAlloc, LocalAlloc e HeapAlloc finalmente aloquem memória do mesmo heap, cada uma fornece um conjunto ligeiramente diferente de funcionalidade. Por exemplo, HeapAlloc pode ser instruído a gerar uma exceção se a memória não puder ser alocada, uma funcionalidade não disponível com LocalAlloc. LocalAlloc dá suporte à alocação de identificadores que permitem que a memória subjacente seja movida por uma realocação sem alterar o valor do identificador, uma funcionalidade não disponível com HeapAlloc.
Começando com Windows de 32 bits, GlobalAlloc e LocalAlloc são implementados como funções wrapper que chamam HeapAlloc usando um identificador para o heap padrão do processo. Portanto, GlobalAlloc e LocalAlloc têm uma sobrecarga maior que HeapAlloc.
Como os diferentes alocadores de heap fornecem funcionalidade distinta usando mecanismos diferentes, você deve liberar memória com a função correta. Por exemplo, a memória alocada com HeapAlloc deve ser liberada com HeapFree e não LocalFree ou GlobalFree. A memória alocada com GlobalAlloc ou LocalAlloc deve ser consultada, validada e liberada com a função global ou local correspondente.
A função VirtualAlloc permite que você especifique opções adicionais para alocação de memória. No entanto, suas alocações usam uma granularidade de página, portanto, usar VirtualAlloc pode resultar em maior uso de memória.
A função malloc tem a desvantagem de depender do tempo de execução. O novo operador tem a desvantagem de ser dependente do compilador e dependente da linguagem.
A função CoTaskMemAlloc tem a vantagem de funcionar bem em C, C++ou Visual Basic. Também é a única maneira de compartilhar memória em um aplicativo baseado em COM, já que MIDL usa CoTaskMemAlloc e CoTaskMemFree para fazer marshaling de memória.
Exemplos
Tópicos relacionados: