Udostępnij za pośrednictwem


Błąd kompilatora C3859

Nie można utworzyć pamięci wirtualnej dla PCH

Komunikat zawiera jedną z następujących notatek:

System zwrócił kod błędu: komunikat o błędzie systemu operacyjnego
PCH: Adres nie jest wielokrotnością stopnia szczegółowości alokacji systemu
PCH: Fragment nie został wcześniej zarezerwowany
PCH: Zbyt duży rozmiar zatwierdzenia
PCH: Nie można zatwierdzić pamięci na mapie plików
PCH: wyczerpana lista fragmentów przed zatwierdzeniem wszystkich bajtów
PCH: Nieoczekiwany koniec listy fragmentów podczas próby zwolnienia
PCH: Nie należy osiągać mapy plików w przypadku decommit
PCH: nieprawidłowy fragment
PCH: Rozmiar mapy jest za duży
PCH: Nie można zamapować pliku: pamięć jest już zatwierdzona
PCH: Mapa plików jest już w miejscu
PCH: Nie można pobrać żądanego bloku pamięci
Rozważ użycie /Fp, aby umożliwić kompilatorowi wcześniejsze zarezerwowanie pamięci

Za mało pamięci wirtualnej przydzielonej dla prekompilowanego nagłówka (PCH). Jeśli prekompilowany nagłówek używa jawnej #pragma hdrstop dyrektywy, użyj /Zm flagi kompilatora, aby określić większą wartość dla wstępnie skompilowanego pliku nagłówka. W przeciwnym razie rozważ zmniejszenie liczby równoległych procesów kompilacji w kompilacji. Aby uzyskać więcej informacji, zobacz /Zm (Określ wstępnie skompilowany limit alokacji pamięci nagłówka).

Ta diagnostyka jest wyświetlana głównie w dwóch scenariuszach:

Pierwszy scenariusz polega na tym, że system jest przeciążony wieloma /Yu żądaniami kompilacji w tym samym czasie. Ustawienie maksymalnego rozmiaru początkowej pamięci wirtualnej zwykle rozwiązuje ten problem.

Drugi scenariusz polega na tym, że moduł ładujący systemu Windows wprowadza bibliotekę DLL do procesu podczas uruchamiania. Ta wstrzyknięta biblioteka DLL może przydzielić pamięć, która powoduje konflikt z miejscem, w którym musi znajdować się PCH. Na przykład msbuild.exe wprowadza do FileTracker.dll każdego CL.exe procesu podczas uruchamiania. W tym scenariuszu użycie flagi /Fp (nazwa pliku pch) gwarantuje, że pamięć dla PCH zostanie przydzielona tak szybko, jak to możliwe w CL.exe procesie, zanim wszelkie wprowadzone biblioteki DLL spróbują zajmować przestrzeń adresową. Te błędy mogą być sporadyczne, ponieważ losowa alokacja układu przestrzeni adresowej systemu Windows (ASLR) przydziela pamięć na różnych adresach w różnych wywołaniach procesów. Bez /Fpprogramu nie można przydzielić pamięci dla PCH, dopóki kompilator nie znajdzie pliku #include nagłówka określonego /Yu w opcji wiersza polecenia lub #pragma hdrstop. W tym czasie znacznie bardziej prawdopodobne jest, że pamięć wymagana przez PCH jest już zarezerwowana.