Udostępnij przez


Ostrzeżenie kompilatora (poziom 1) C4530

Użyto programu obsługi wyjątków języka C++, ale semantyka nie jest włączona. Określ /EHsc

Uwagi

Kod używa obsługi wyjątków języka C++, ale /EHsc nie został uwzględniony w opcjach kompilatora.

Kompilator wymaga /EHsc opcji kompilowania kodu C++, który jest zgodny ze standardem C++ na potrzeby obsługi wyjątków. Semantyka odwijanie standardowego języka C++ określa, że obiekty i ramki stosu skonstruowane między miejscem zgłaszania wyjątku a miejscem jego przechwycenia muszą zostać zniszczone, a ich zasoby odzyskane. Ten proces jest znany jako odwijanie stosu.

Opcja /EHsc informuje kompilator o wygenerowaniu kodu, który wywołuje destruktory na obiektach automatycznego magazynu, gdy wyjątek przechodzi przez zawierającą ramkę stosu. Automatyczne obiekty magazynu to obiekty przydzielone na stosie, takie jak zmienne lokalne. Jest ona nazywana magazynem automatycznym, ponieważ jest przydzielana automatycznie, gdy są wywoływane funkcje, i jest zwalniana automatycznie po ich powrocie. Ramka stosu to dane umieszczone na stosie po wywołaniu funkcji wraz z automatycznym magazynem.

Po wystąpieniu wyjątku może on przechodzić przez kilka ramek stosu, zanim zostanie przechwycony. Te ramki stosu muszą być rozłączane, ponieważ wyjątek przechodzi przez nie w odwrotnej kolejności wywoływania. Aby odzyskać swoje zasoby, należy zniszczyć automatyczne obiekty magazynu w każdej ramce stosu. Jest to ten sam proces zniszczenia i odzyskiwania, który odbywa się automatycznie, gdy funkcja zwraca normalnie.

/EHsc Jeśli opcja nie jest włączona, automatyczne obiekty magazynu w ramkach stosu między funkcją throwing a funkcją, w której wyjątek zostanie przechwycony, nie są niszczone. Tylko automatyczne obiekty magazynu utworzone w try bloku lub catch są niszczone, co może prowadzić do znaczących przecieków zasobów i innych nieoczekiwanych zachowań.

Jeśli nie można zgłosić żadnych wyjątków w pliku wykonywalny, możesz bezpiecznie zignorować to ostrzeżenie. Niektóre kody mogą wymagać innych opcji obsługi wyjątków. Aby uzyskać więcej informacji, zobacz /EH.

Przykład

Poniższy przykład generuje kod C4530:

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

Skompiluj przykład za pomocą polecenia /EHsc , aby rozwiązać problem z ostrzeżeniem.