Sdílet prostřednictvím


Chyba kompilátoru C2712

Aplikace nemůže používat __try ve funkcích, které vyžadují odvíjení objektu.

Poznámky

K chybě C2712 může dojít, pokud použijete /EHsca funkce se strukturovaným zpracováním výjimek má také objekty, které vyžadují odvíjení (zničení).

Možná řešení:

  • Přesunutí kódu, který vyžaduje SEH do jiné funkce

  • Přepište funkce, které používají SEH, aby se zabránilo použití místních proměnných a parametrů, které mají destruktory. Nepoužívejte SEH v konstruktorech nebo destruktory.

  • Kompilace bez /EHsc

K chybě C2712 může dojít také v případě, že voláte metodu deklarovanou pomocí klíčového __event slova. Vzhledem k tomu, že událost může být použita v prostředí s více vlákny, kompilátor vygeneruje kód, který brání manipulaci s podkladovým objektem události, a poté uzavře vygenerovaný kód do příkazutry-finally V důsledku toho dojde k chybě C2712, pokud zavoláte metodu události a předáte hodnotu argument, jehož typ má destruktor. Jedním z řešení v tomto případě je předání argumentu jako konstantního odkazu.

K C2712 může dojít také v případě, že kompilujete /clr:pure a deklarujete statické pole ukazatelů na funkce v __try bloku. Statický člen vyžaduje, aby kompilátor používal dynamickou inicializaci, /clr:purecož znamená zpracování výjimek jazyka C++. Zpracování výjimek jazyka __try C++ však není v bloku povoleno.

Možnosti kompilátoru /clr:pure jsou /clr:safe v sadě Visual Studio 2015 zastaralé a v sadě Visual Studio 2017 nejsou podporované.

Příklad

Následující příklad vygeneruje C2712 a ukazuje, jak ji opravit.

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