Share via


Compilerfehler C3859

Fehler beim Erstellen des virtuellen Speichers für PCH

Die Nachricht weist einen der folgenden Hinweise auf:

Vom System zurückgegebener Code Fehlercode: Betriebssystemfehlermeldung
PCH: Die Adresse ist kein Vielfaches der Zuordnungsgranularität des Systems.
PCH: Der Block wurde nicht zuvor reserviert.
PCH: Commitgröße zu groß
PCH: Committen des Arbeitsspeichers über Dateizuordnung hinweg nicht möglich.
PCH: Blockliste vor dem Committen aller Bytes erschöpft.
PCH: Unerwartetes Ende der Blockliste beim Freigabeversuch
PCH: Im Decommit-Fall sollte keine Dateizuordnung auftreten.
PCH: Ungültiger Block
PCH: Zuordnungsgröße zu groß
PCH: Zuordnen der Datei nicht möglich: Commit für Arbeitsspeicher bereits ausgeführt.
PCH: Dateizuordnung bereits vorhanden
PCH: Der angeforderte Arbeitsspeicherblock konnte nicht abgerufen werden.
Erwägen Sie die Verwendung von /Fp, damit der Compiler den Speicher frühzeitig reservieren kann.

Es ist nicht genügend virtueller Speicher für den vorkompilierten Header (PCH) zugeordnet. Wenn der vorkompilierte Header eine explizite #pragma hdrstop-Anweisung verwendet, verwenden Sie das /Zm-Compilerflag, um einen größeren Wert für die vorkompilierte Headerdatei anzugeben. Andernfalls sollten Sie die Anzahl der parallelen Kompilierungsprozesse in Ihrem Build reduzieren. Weitere Informationen finden Sie unter /Zm (Angeben der Speicherbelegungsgrenze für den vorkompilierten Header).

Diese Diagnose wird hauptsächlich in zwei Szenarios angezeigt:

Das erste Szenario besteht darin, dass das System gleichzeitig mit mehreren /Yu-Kompilierungsanforderungen überladen wird. Wenn Sie die maximale Größe des virtuellen Startspeichers festlegen, wird dieses Problem in der Regel behoben.

Das zweite Szenario ist, wenn das Windows-Ladeprogramm eine DLL in den Prozess beim Start injiziert. Diese injizierte DLL kann Speicher zuordnen, der in Konflikt mit dem Ort steht, an dem sich der PCH befinden muss. Beispielsweise fügt msbuild.exe beim Start FileTracker.dll in jeden CL.exe-Prozess ein. In diesem Szenario stellt die Verwendung des Flags /Fp (Name.pch-Datei) sicher, dass der Speicher für den PCH im CL.exe-Prozess so früh wie möglich zugewiesen wird, bevor alle injizierten DLLs versuchen, den Adressraum zu belegen. Diese Fehler können zeitweise auftreten, da die zufällige Anordnung des Layouts des Windows-Addressraums (ASLR, Address Space Layout Randomization) Speicher an verschiedenen Adressen über verschiedene Prozessaufrufe hinweg zuweist. Ohne /Fp kann der Arbeitsspeicher für den PCH erst zugewiesen werden, wenn der Compiler die Headerdatei #include findet, die in der Befehlszeilenoption /Yu oder #pragma hdrstop angegeben ist. Zu diesem Zeitpunkt ist es viel wahrscheinlicher, dass der vom PCH erforderliche Speicher bereits reserviert ist.