Freigeben über


Compilerwarnung (Ebene 1) C4530

C++-Handler verwendet, aber Entladesemantik ist nicht aktiviert. Geben Sie /EHsc an

Der Code verwendet die C++-Ausnahmebehandlung, aber /EHsc war in den Compileroptionen nicht enthalten.

Hinweise

Der Compiler erfordert die /EHsc Möglichkeit, C++-Code zu erstellen, der dem C++-Standard für die Ausnahmebehandlung folgt. Die Standard-C++ -Semantik gibt an, dass Objekte und Stapelframes , die zwischen dem Auslösen einer Ausnahme erstellt wurden, und dem Ort, an dem sie abgefangen werden, zerstört werden müssen und ihre Ressourcen wiederhergestellt werden müssen. Dieser Prozess wird als Abwickeln des Stapels bezeichnet.

Die /EHsc Option weist den Compiler an, Code zu generieren, der die Destruktoren für automatische Speicherobjekte aufruft, wenn eine Ausnahme den enthaltenden Stapelframe durchläuft. Automatische Speicherobjekte sind Objekte, die dem Stapel zugeordnet sind, z. B. lokale Variablen. Es wird als automatischer Speicher bezeichnet, da er automatisch zugewiesen wird, wenn Funktionen aufgerufen werden und automatisch freigegeben werden, wenn sie zurückgegeben werden. Ein Stapelframe ist die Daten, die im Stapel platziert werden, wenn eine Funktion aufgerufen wird, zusammen mit dem automatischen Speicher.

Wenn eine Ausnahme ausgelöst wird, kann sie mehrere Stapelframes durchlaufen, bevor sie abgefangen wird. Diese Stapelframes müssen aufgehoben werden, da die Ausnahme sie in umgekehrter Aufrufreihenfolge durchläuft. Die automatischen Speicherobjekte in jedem Stapelframe müssen zerstört werden, um ihre Ressourcen sauber wiederherzustellen. Es ist derselbe Vernichtungs- und Wiederherstellungsvorgang, der automatisch erfolgt, wenn eine Funktion normal zurückgegeben wird.

Wenn die /EHsc Option nicht aktiviert ist, werden automatische Speicherobjekte in den Stapelframes zwischen der auslösenden Funktion und der Funktion, in der die Ausnahme abgefangen wird, nicht zerstört. Nur die automatischen Speicherobjekte, die in einem try Oder catch Block erstellt wurden, werden zerstört, was zu erheblichen Ressourcenlecks und anderen unerwarteten Verhaltensweisen führen kann.

Wenn in Ihrer ausführbaren Datei möglicherweise keine Ausnahmen ausgelöst werden können, ignorieren Sie diese Warnung möglicherweise sicher. Für einige Code sind möglicherweise andere Ausnahmebehandlungsoptionen erforderlich. Weitere Informationen finden Sie unter /EH.

Beispiel

Im folgenden Beispiel wird C4530 generiert:

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

Kompilieren Sie das Beispiel mit /EHsc , um die Warnung zu beheben.