Kompilatorfel C2712

kan inte använda __try i funktioner som kräver att objektet avspolas

Anmärkningar

Fel C2712 kan inträffa om du använder /EHsc, och en funktion med strukturerad undantagshantering har också objekt som kräver avspolning (destruktion).

Möjliga lösningar:

  • Flytta kod som kräver SEH till en annan funktion

  • Skriv om funktioner som använder SEH för att undvika användning av lokala variabler och parametrar som har destructors. Använd inte SEH i konstruktorer eller destruktorer

  • Kompilera utan /EHsc

Fel C2712 kan också inträffa om du anropar en metod som deklarerats med hjälp av nyckelordet __event . Eftersom händelsen kan användas i en flertrådad miljö genererar kompilatorn kod som förhindrar manipulering av det underliggande händelseobjektet och omger sedan den genererade koden i en SEH-instruktiontry-finally. Därför uppstår felet C2712 om du anropar händelsemetoden och skickar ett värde till ett argument vars typ har en destructor. En lösning i det här fallet är att skicka argumentet som en konstant referens.

C2712 kan också inträffa om du kompilerar med och deklarerar en statisk matris med /clr:pure pekare till funktioner i ett __try block. En statisk medlem kräver att kompilatorn använder dynamisk initiering under /clr:pure, vilket innebär C++-undantagshantering. C++-undantagshantering tillåts dock inte i ett __try block.

Alternativen /clr:pure och /clr:safe kompilatorn är inaktuella i Visual Studio 2015 och stöds inte i Visual Studio 2017.

Exempel

I följande exempel genereras C2712 och hur du åtgärdar det.

// 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) {}
}