Bagikan melalui


Compiler Warning (level 1) C4530

Handler pengecualian C++ yang digunakan, tetapi semantik unwind tidak diaktifkan. Tentukan /EHsc

Kode ini menggunakan penanganan pengecualian C++, tetapi /EHsc tidak disertakan dalam opsi pengkompilasi.

Keterangan

Pengkompilasi memerlukan /EHsc opsi untuk membuat kode C++ yang mengikuti standar C++ untuk penanganan pengecualian. Semantik unwind C++ standar menentukan bahwa objek dan bingkai tumpukan yang dibangun antara tempat pengecualian dilemparkan dan di mana tertangkap harus dihancurkan dan sumber dayanya dipulihkan. Proses ini dikenal sebagai melepas tumpukan.

Opsi ini /EHsc memberi tahu pengkompilasi untuk menghasilkan kode yang memanggil destruktor pada objek penyimpanan otomatis ketika pengecualian melewati bingkai tumpukan yang berisi. Objek penyimpanan otomatis adalah objek yang dialokasikan pada tumpukan, seperti variabel lokal. Ini disebut penyimpanan otomatis karena dialokasikan secara otomatis saat fungsi dipanggil, dan dirilis secara otomatis saat kembali. Bingkai tumpukan adalah data yang ditempatkan pada tumpukan ketika fungsi dipanggil, bersama dengan penyimpanan otomatisnya.

Ketika pengecualian dilemparkan, itu dapat melakukan perjalanan melalui beberapa bingkai tumpukan sebelum tertangkap. Bingkai tumpukan ini harus dilepaskan karena pengecualian melewatinya dalam urutan panggilan terbalik. Objek penyimpanan otomatis di setiap bingkai tumpukan harus dihancurkan untuk memulihkan sumber daya mereka dengan bersih. Ini adalah proses penghancuran dan pemulihan yang sama yang terjadi secara otomatis ketika fungsi kembali normal.

/EHsc Ketika opsi tidak diaktifkan, objek penyimpanan otomatis dalam bingkai tumpukan antara fungsi pelemparan dan fungsi di mana pengecualian tertangkap tidak dihancurkan. Hanya objek penyimpanan otomatis yang try dibuat di blok atau catch yang dihancurkan, yang dapat menyebabkan kebocoran sumber daya yang signifikan dan perilaku tak terduga lainnya.

Jika tidak ada pengecualian yang mungkin dapat dilemparkan dalam executable Anda, Anda dapat dengan aman mengabaikan peringatan ini. Beberapa kode mungkin memerlukan opsi penanganan pengecualian lainnya. Untuk informasi selengkapnya, lihat /EH.

Contoh

Sampel berikut menghasilkan C4530:

// C4530.cpp
// compile with: /W1
int main() {
   try{} catch(int*) {}   // C4530
}

Kompilasi sampel dengan /EHsc untuk mengatasi peringatan.