Compartilhar via


Erro do compilador C3859

Falha ao criar a memória virtual para o PCH

A mensagem contém uma das seguintes observações:

O sistema retornou um código de erro: mensagem de erro do sistema operacional
PCH: o endereço não é um múltiplo da granularidade de alocação do sistema
PCH: a parte não foi reservada anteriormente
PCH: o tamanho da confirmação é muito grande
PCH: não foi possível confirmar a memória no mapa de arquivos
PCH: lista de partes esgotada antes de confirmar todos os bytes
PCH: fim inesperado da lista de partes ao tentar liberar
PCH: não deveria estar atingindo um mapa de arquivos no processo de anulação da confirmação
PCH: parte inválida
PCH: o tamanho do mapa é muito grande
PCH: não foi possível mapear o arquivo; a memória já foi confirmada
PCH: o mapa de arquivos já existe
PCH: não foi possível obter o bloco de memória solicitado
Pense em usar /Fp para permitir que o compilador reserve a memória antecipadamente

Não há memória virtual suficiente alocada para o seu cabeçalho pré-compilado (PCH). Se o seu cabeçalho pré-compilado usar uma diretiva #pragma hdrstop explícita, use o sinalizador do compilador /Zm para especificar um valor maior para o arquivo de cabeçalho pré-compilado. Caso contrário, considere reduzir o número de processos de compilação paralelos em seu build. Para obter mais informações, consulte /Zm (Especificar limite de alocação de memória de cabeçalho pré-compilado).

Esse diagnóstico aparece principalmente em dois cenários:

O primeiro cenário é que o sistema está sobrecarregado com várias solicitações de compilação /Yu ao mesmo tempo. A definição do tamanho máximo da memória virtual inicial costuma resolver esse problema.

O segundo cenário é quando o carregador do Windows injeta uma DLL no processo na inicialização. Essa DLL injetada pode alocar uma memória que esteja em conflito com o local em que o PCH precisa residir. Por exemplo, o msbuild.exe injeta um FileTracker.dll em todos os processos CL.exe na inicialização. Nesse cenário, o uso do sinalizador /Fp (nome do arquivo .pch) garante que a memória para o PCH seja alocada o mais cedo possível no processo CL.exe, antes que qualquer DLLs injetada tente ocupar o espaço do endereço. Essas falhas podem ser intermitentes porque a Randomização do Layout do Espaço de Endereços do Windows (ASLR) aloca a memória em endereços diferentes nas diferentes invocações de processos. Sem o /Fp, a memória para o PCH não pode ser alocada antes de o compilador encontrar o arquivo de cabeçalho #include especificado na opção da linha de comando /Yu ou no #pragma hdrstop. Nesta altura, é bem mais provável que a memória exigida pelo PCH já esteja reservada.