Bagikan melalui


Compiler Error C3859

Gagal membuat memori virtual untuk PCH

Pesan memiliki salah satu catatan berikut:

Kode kesalahan kode yang dikembalikan sistem: pesan kesalahan OS
PCH: Alamat bukan kelipatan granularitas alokasi sistem
PCH: Gugus belum dicadangkan sebelumnya
PCH: Ukuran penerapan terlalu besar
PCH: Tidak dapat menerapkan memori di seluruh peta file
PCH: Daftar gugus habis sebelum menerapkan semua byte
PCH: Akhir tak terduga dari daftar gugus saat mencoba untuk membebaskan
PCH: Seharusnya tidak mengenai peta file dalam kasus penonaktifan
PCH: Potongan tidak valid
PCH: Ukuran peta terlalu besar
PCH: Tidak dapat memetakan file: memori sudah diterapkan
PCH: Peta file sudah ada
PCH: Tidak bisa mendapatkan blok memori yang diminta
Pertimbangkan untuk menggunakan /Fp untuk memungkinkan pengkompilasi memesan memori lebih awal

Memori virtual yang dialokasikan untuk header (PCH) yang telah dikommpilasikan sebelumnya tidak cukup. Jika header yang telah dikompilasi sebelumnya menggunakan arahan eksplisit #pragma hdrstop , gunakan /Zm bendera kompilator untuk menentukan nilai yang lebih besar untuk file header yang telah dikompilasi sebelumnya. Jika tidak, pertimbangkan untuk mengurangi jumlah proses kompilasi paralel dalam build Anda. Untuk informasi selengkapnya, lihat /Zm (Tentukan batas alokasi memori header yang telah dikompretasi).

Diagnostik ini sebagian besar muncul dalam dua skenario:

Skenario pertama adalah sistem kelebihan beban dengan beberapa /Yu permintaan kompilasi secara bersamaan. Mengatur ukuran memori virtual awal maksimum biasanya menyelesaikan masalah ini.

Skenario kedua adalah ketika pemuat Windows menyuntikkan DLL ke dalam proses saat startup. DLL yang disuntikkan tersebut dapat mengalokasikan memori yang bertentangan dengan tempat PCH harus berada. Misalnya, msbuild.exe menyuntikkan FileTracker.dll ke setiap CL.exe proses saat startup. Dalam skenario ini, menggunakan /Fp bendera (Nama file .pch) memastikan bahwa memori untuk PCH dialokasikan sedini mungkin dalam CL.exe proses, sebelum DLL yang disuntikkan mencoba menempati ruang alamat. Kegagalan ini dapat terputus-terputus karena Windows Address Space Layout Randomization (ASLR) mengalokasikan memori pada alamat yang berbeda di berbagai pemanggilan proses. Tanpa /Fp, memori untuk PCH tidak dapat dialokasikan sampai pengkompilasi menemukan file #include header yang ditentukan dalam /Yu opsi baris perintah atau #pragma hdrstop. Pada saat ini, kemungkinan besar memori yang diperlukan oleh PCH sudah dicadangkan.