Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Escolher o método de alocação correto
Use as seguintes orientações para selecionar a API de alocação de memória adequada para o seu cenário:
| Scenario | API recomendada | Notes |
|---|---|---|
| Alocações de uso geral em C++ | new / std::make_unique / std::make_shared |
Escolha padrão para código C++. Usa o CRT heap internamente. O RAII assegura limpeza automática. |
| Alocações C de uso geral | malloc / calloc / realloc |
Escolha padrão para código C. Portátil entre plataformas. |
| Alocações superiores a ~1 MB ou que requerem controlo ao nível da página | VirtualAlloc | Aloca com granularidade de página (tipicamente 4 KB). Usar para reservar grandes intervalos de endereços, páginas de proteção ou memória com atributos de proteção específicos (PAGE_READWRITE, PAGE_EXECUTE_READ, etc.). |
| Muitas pequenas alocações com controlo personalizado (por exemplo, alocador de pool) | HeapAlloc / HeapCreate | Crie um heap privado para controlo de isolamento ou serialização. Use HEAP_NO_SERIALIZE apenas se o heap for exclusivamente single-threaded. |
| Interoperação COM (memória marshaled) | CoTaskMemAlloc | Obrigatório quando a memória ultrapassa os limites do apartamento da COM. Os stubs gerados pelo MIDL usam CoTaskMemAlloc/CoTaskMemFree. |
| Código legado usando memória móvel | GlobalAlloc / LocalAlloc | Evite para código novo. Estas adicionam sobrecarga ao HeapAlloc e existem principalmente para compatibilidade retrocedente com operações de prancha e certas APIs Win32 que as exigem. |
Importante
Emparelhe sempre corretamente as funções de alocação e deslocação. A memória alocada com HeapAlloc deve ser libertada com HeapFree — not free() ou LocalFree. Misturar famílias de alocação/desalocação causa corrupção do heap que é difícil de diagnosticar.
Note
VirtualAlloc vs HeapAlloc: O VirtualAlloc opera com granularidade de página (mínimo 4 KB, reservas alinhadas para SYSTEM_INFO.dwAllocationGranularity, tipicamente 64 KB). Alocar muitos objetos pequenos com o VirtualAlloc desperdiça espaço de endereçamento. Use HeapAlloc (ou malloc/new) para alocações pequenas e frequentes. Use o VirtualAlloc quando precisar de reservar grandes regiões de endereço, controlar a proteção da página ou implementar alocadores personalizados.
Comparação detalhada
Segue-se 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 acabem por alocar memória do mesmo heap, cada uma fornece um conjunto ligeiramente diferente de funcionalidades. Por exemplo, o HeapAlloc pode ser instruído a criar uma exceção se a memória não puder ser alocada, uma capacidade que não está disponível com o LocalAlloc. O LocalAlloc suporta a alocação de handles que permitem que a memória subjacente seja movida por uma realocação sem alterar o valor do handle, uma funcionalidade que não está disponível com o HeapAlloc.
A partir do Windows de 32 bits, o GlobalAlloc e o LocalAlloc são implementados como funções envolventes que chamam o HeapAlloc usando um handle para o heap padrão do processo. Portanto, o GlobalAlloc e o LocalAlloc têm maior sobrecarga do que o HeapAlloc.
Como os diferentes alocadores de heap fornecem funcionalidades distintas ao usar mecanismos distintos, deve libertar memória com a função correta. Por exemplo, a memória alocada com HeapAlloc deve ser libertada com HeapFree e não com LocalFree ou GlobalFree. A memória alocada com GlobalAlloc ou LocalAlloc deve ser consultada, validada e libertada com a função global ou local correspondente.
A função VirtualAlloc permite-lhe especificar opções adicionais para a alocação de memória. No entanto, as suas alocações utilizam uma granularidade de página, pelo que usar o VirtualAlloc pode resultar num 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 depender do compilador e da linguagem.
A função CoTaskMemAlloc tem a vantagem de funcionar bem em C, C++ ou Visual Basic. É também a única forma de partilhar memória numa aplicação baseada em COM, uma vez que o MIDL utiliza o CoTaskMemAlloc e o CoTaskMemFree para organizar a memória.
Examples
Tópicos relacionados