Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Aplikace nemůže používat
__tryve 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) {}
}