Condividi tramite


Errore del compilatore C2712

non può essere usato __try nelle funzioni che richiedono la rimozione di oggetti

Osservazioni:

L'errore C2712 può verificarsi se si usa /EHsce una funzione con la gestione delle eccezioni strutturata include anche oggetti che richiedono la rimozione (distruzione).

Soluzioni possibili:

  • Spostare il codice che richiede SEH in un'altra funzione

  • Riscrivere le funzioni che usano SEH per evitare l'uso di variabili e parametri locali contenenti distruttori. Non usare SEH nei costruttori o nei distruttori

  • Compilare senza /EHsc

L'errore C2712 può verificarsi anche se si chiama un metodo dichiarato usando la __event parola chiave . Poiché l'evento può essere usato in un ambiente multithreading, il compilatore genera codice che impedisce la manipolazione dell'oggetto evento sottostante e quindi racchiude il codice generato in un'istruzione SEHtry-finally. Di conseguenza, l'errore C2712 si verificherà se si chiama il metodo dell'evento e si passa per valore un argomento il cui tipo contiene un distruttore. Una soluzione in questo caso consiste nel passare l'argomento come riferimento costante.

C2712 può verificarsi anche se si compila con /clr:pure e si dichiara una matrice statica di puntatori a funzioni in un __try blocco. Un membro statico richiede al compilatore di usare l'inizializzazione dinamica in /clr:pure, che implica la gestione delle eccezioni C++. La gestione delle eccezioni C++ non è però consentita in un blocco __try.

Le opzioni del /clr:pure compilatore e /clr:safe sono deprecate in Visual Studio 2015 e non supportate in Visual Studio 2017.

Esempio

L'esempio seguente genera l'errore C2712 e mostra come risolverlo.

// C2712.cpp
// compile with: /clr:pure /c
struct S1 {
   static int smf();
   void fnc();
};

void S1::fnc() {
   __try {
      static int (*array_1[])() = {smf,};   // C2712

      // OK
      static int (*array_2[2])();
      array_2[0] = smf;
    }
    __except(0) {}
}