Поделиться через


Ошибка компилятора C3859

Не удалось создать виртуальную память для PCH

Сообщение содержит одно из следующих заметок:

Код ошибки кода, возвращенный системой: сообщение об ошибке ОС
PCH: адрес не является нескольким из детализации распределения системы
PCH: блок не был зарезервирован ранее
PCH: слишком большой размер фиксации
PCH: не удается зафиксировать память на карте файлов
PCH: исчерпанный список блоков перед фиксацией всех байтов
PCH: непредвиденный конец списка блоков при попытке освободить
PCH: не следует ударять по карте файлов в случае вывода из эксплуатации
PCH: недопустимый блок
PCH: слишком большой размер карты
PCH: не удается сопоставить файл: память уже зафиксирована
PCH: карта файлов уже на месте
PCH: не удается получить запрошенный блок памяти
Рекомендуется использовать /Fp, чтобы компилятор зарезервировать память раньше

Недостаточно виртуальной памяти, выделенной для предварительно скомпилированного заголовка (PCH). Если предкомпилированный заголовок использует явную #pragma hdrstop директиву, используйте /Zm флаг компилятора, чтобы указать большее значение для предварительно скомпилированного файла заголовка. В противном случае рекомендуется уменьшить количество параллельных процессов компиляции в сборке. Дополнительные сведения см. в разделе /Zm (Указание ограничения выделения памяти предварительной компиляции заголовка).

Эта диагностика отображается в основном в двух сценариях:

Первый сценарий заключается в том, что система перегружена несколькими /Yu запросами компиляции одновременно. Установка максимального начального размера виртуальной памяти обычно устраняет эту проблему.

Второй сценарий заключается в том, что загрузчик Windows внедряет библиотеку DLL в процесс при запуске. Эта внедренная библиотека DLL может выделить память, которая конфликтует с местом расположения PCH. Например, msbuild.exe внедряется FileTracker.dll в каждый CL.exe процесс при запуске. В этом сценарии использование флага /Fp (PCH-файла name) гарантирует, что память для PCH выделяется как можно раньше в CL.exe процессе, прежде чем все внедренные библиотеки DLL пытаются занять адресное пространство. Эти сбои могут быть периодическими, так как случайное распределение пространства адресов Windows (ASLR) выделяет память по разным адресам в разных вызовах процесса. Без /Fpэтого память для PCH не может быть выделена, пока компилятор не найдет файл #include заголовка, указанный в параметре командной /Yu строки или .#pragma hdrstop К этому времени гораздо более вероятно, что память, требуемая PCH, уже зарезервирована.