Condividi tramite


Avviso del compilatore (livello 1) C4530

Il gestore eccezioni C++ usato, ma la semantica di rimozione non è abilitata. Specificare /EHsc

Il codice usa la gestione delle eccezioni C++, ma /EHsc non è stato incluso nelle opzioni del compilatore.

Osservazioni:

Il compilatore richiede l'opzione /EHsc per compilare codice C++ che segue lo standard C++ per la gestione delle eccezioni. La semantica di rimozione C++ standard specifica che gli oggetti e gli stack frame costruiti tra la posizione in cui viene generata un'eccezione e la posizione in cui viene intercettata devono essere eliminati definitivamente e le relative risorse recuperate. Questo processo è noto come rimozione dello stack.

L'opzione /EHsc indica al compilatore di generare codice che chiama i distruttori sugli oggetti di archiviazione automatica quando un'eccezione passa attraverso lo stack frame contenitore. Gli oggetti di archiviazione automatica sono oggetti allocati nello stack, ad esempio variabili locali. Si chiama archiviazione automatica perché viene allocata automaticamente quando vengono chiamate le funzioni e rilasciate automaticamente quando restituiscono. Uno stack frame è i dati inseriti nello stack quando viene chiamata una funzione, insieme alla relativa risorsa di archiviazione automatica.

Quando viene generata un'eccezione, può spostarsi tra diversi stack frame prima che venga intercettata. Questi stack frame devono essere scollegati quando l'eccezione passa attraverso di essi in ordine di chiamata inverso. Gli oggetti di archiviazione automatica in ogni stack frame devono essere eliminati definitivamente per ripristinare le risorse in modo pulito. Si tratta dello stesso processo di distruzione e ripristino che si verifica automaticamente quando una funzione restituisce normalmente.

Quando l'opzione /EHsc non è abilitata, gli oggetti di archiviazione automatica negli stack frame tra la funzione di generazione e la funzione in cui viene intercettata l'eccezione non vengono eliminati definitivamente. Solo gli oggetti di archiviazione automatica creati in un try blocco o catch vengono eliminati definitivamente, causando perdite significative di risorse e altri comportamenti imprevisti.

Se non è possibile generare eccezioni nel file eseguibile, è possibile ignorare questo avviso in modo sicuro. Un codice potrebbe richiedere altre opzioni di gestione delle eccezioni. Per altre informazioni, vedere /EH.

Esempio

L'esempio seguente genera l'errore C4530:

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

Compilare l'esempio con /EHsc per risolvere l'avviso.