Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
kan inte använda
__tryi 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) {}
}