Funções globais e locais

As funções globais e locais têm suporte para portabilidade de código de 16 bits ou para manter a compatibilidade do código-fonte com o Windows de 16 bits. A partir do Windows de 32 bits, as funções globais e locais são implementadas como funções wrapper que chamam as funções de heap correspondentes usando um identificador para o heap padrão do processo. Portanto, as funções globais e locais têm maior sobrecarga do que outras funções de gerenciamento de memória.

As funções de heap fornecem mais recursos e controle do que as funções globais e locais. Novos aplicativos devem usar as funções de heap, a menos que a documentação declare especificamente que uma função global ou local deve ser usada. Por exemplo, algumas funções do Windows alocam memória que deve ser liberada com LocalFree e as funções globais ainda são usadas com o DDE (Troca Dinâmica de Dados), as funções de área de transferência e objetos de dados OLE. Para obter uma lista completa de funções globais e locais, consulte a tabela em Funções de Gerenciamento de Memória.

O gerenciamento de memória do Windows não fornece um heap local e um heap global separados, como faz o Windows de 16 bits. Como resultado, as famílias globais e locais de funções são equivalentes e escolher entre elas é uma questão de preferência pessoal. Observe que a alteração de um modelo de memória segmentada de 16 bits para um modelo de memória virtual de 32 bits tornou algumas das funções globais e locais relacionadas e suas opções desnecessárias ou sem sentido. Por exemplo, não há mais ponteiros próximos e distantes, pois as alocações locais e globais retornam endereços virtuais de 32 bits.

Os objetos de memória alocados por GlobalAlloc e LocalAlloc estão em páginas privadas e confirmadas com acesso de leitura/gravação que não podem ser acessados por outros processos. A memória alocada usando GlobalAlloc com GMEM_DDESHARE não é realmente compartilhada globalmente como no Windows de 16 bits. Esse valor não tem efeito e está disponível apenas para compatibilidade. Os aplicativos que exigem memória compartilhada para outras finalidades devem usar objetos de mapeamento de arquivo. Vários processos podem mapear uma exibição do mesmo objeto de mapeamento de arquivo para fornecer memória compartilhada nomeada. Para obter mais informações, consulte Mapeamento de arquivos.

As alocações de memória são limitadas apenas pela memória física disponível, incluindo o armazenamento no arquivo de paginação no disco. Quando você aloca memória fixa, GlobalAlloc e LocalAlloc retornam um ponteiro que o processo de chamada pode usar imediatamente para acessar a memória. Quando você aloca memória movevel, o valor retornado é um identificador. Para obter um ponteiro para um objeto de memória móvel, use as funções GlobalLock e LocalLock .

O tamanho real da memória alocada pode ser maior do que o tamanho solicitado. Para determinar o número real de bytes alocados, use a função GlobalSize ou LocalSize . Se o valor alocado for maior que o valor solicitado, o processo poderá usar todo o valor.

As funções GlobalReAlloc e LocalReAlloc alteram o tamanho ou os atributos de um objeto de memória alocado por GlobalAlloc e LocalAlloc. O tamanho pode aumentar ou diminuir.

As funções GlobalFree e LocalFree liberam memória alocada por GlobalAlloc, LocalAlloc, GlobalReAlloc ou LocalReAlloc. Para descartar o objeto de memória especificado sem invalidar o identificador, use a função GlobalDiscard ou LocalDiscard . O identificador pode ser usado posteriormente por GlobalReAlloc ou LocalReAlloc para alocar um novo bloco de memória associado ao mesmo identificador.

Para retornar informações sobre um objeto de memória especificado, use a função GlobalFlags ou LocalFlags . As informações incluem a contagem de bloqueios do objeto e indicam se o objeto é descartado ou já foi descartado. Para retornar um identificador para o objeto de memória associado a um ponteiro especificado, use a função GlobalHandle ou LocalHandle .

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