Condividi tramite


Errore del compilatore C3859

Impossibile creare memoria virtuale per PCH

Il messaggio contiene una delle note seguenti:

Codice di errore restituito dal sistema: messaggio di errore del sistema operativo
PCH: l'indirizzo non è un multiplo della granularità di allocazione del sistema
PCH: Il blocco non è stato precedentemente riservato
PCH: dimensioni del commit troppo grandi
PCH: impossibile eseguire il commit della memoria nella mappa file
PCH: Elenco blocchi esauriti prima di eseguire il commit di tutti i byte
PCH: Fine imprevista dell'elenco blocchi durante il tentativo di liberare
PCH: non dovrebbe colpire una mappa file nel caso di decommit
PCH: blocco non valido
PCH: dimensioni della mappa troppo grandi
PCH: Impossibile eseguire il mapping del file: memoria già sottoposta a commit
PCH: Mappa file già presente
PCH: impossibile ottenere il blocco di memoria richiesto
Prendere in considerazione l'uso di /Fp per consentire al compilatore di riservare la memoria in anticipo

La memoria virtuale allocata per l'intestazione precompilata (PCH) non è sufficiente. Se l'intestazione precompilata usa una direttiva esplicita #pragma hdrstop , usare il flag del /Zm compilatore per specificare un valore più grande per il file di intestazione precompilato. In caso contrario, valutare la possibilità di ridurre il numero di processi di compilazione paralleli nella compilazione. Per altre informazioni, vedere /Zm (Specificare il limite di allocazione della memoria dell'intestazione precompilata) .

Questa diagnostica viene visualizzata principalmente in due scenari:

Il primo scenario è che il sistema è sovraccarico con più /Yu richieste di compilazione contemporaneamente. L'impostazione delle dimensioni massime della memoria virtuale di avvio risolve in genere questo problema.

Il secondo scenario è quando il caricatore di Windows inserisce una DLL nel processo all'avvio. Tale DLL inserita può allocare memoria in conflitto con la posizione in cui deve risiedere il PCH. Ad esempio, msbuild.exe inserisce FileTracker.dll in ogni CL.exe processo all'avvio. In questo scenario, l'uso del /Fp flag (file con estensione pch) garantisce che la memoria per PCH venga allocata il prima possibile nel CL.exe processo, prima che qualsiasi DLL inserita tenti di occupare lo spazio degli indirizzi. Questi errori possono essere intermittenti perché ASLR (Address Space Layout Randomization) di Windows alloca memoria a indirizzi diversi tra chiamate di processo diverse. Senza /Fp, la memoria per pch non può essere allocata finché il compilatore non trova il file #include di intestazione specificato nell'opzione della /Yu riga di comando o .#pragma hdrstop In questo momento, è molto più probabile che la memoria richiesta dal PCH sia già riservata.