Partilhar via


Erro do compilador C2712

não pode ser usado __try em funções que exigem desenrolamento de objetos

Observações

O erro C2712 pode ocorrer se você usar /EHsc, e uma função com manipulação de exceção estruturada também tem objetos que exigem desenrolamento (destruição).

Soluções possíveis:

  • Mover código que requer SEH para outra função

  • Reescreva funções que usam SEH para evitar o uso de variáveis locais e parâmetros que tenham destruidores. Não utilize SEH em construtores ou destruidores

  • Compilar sem /EHsc

O erro C2712 também pode ocorrer se você chamar um método declarado usando a __event palavra-chave. Como o evento pode ser usado em um ambiente multithreaded, o compilador gera código que impede a manipulação do objeto de evento subjacente e, em seguida, inclui o código gerado em uma instrução SEHtry-finally. Consequentemente, o erro C2712 ocorrerá se você chamar o método de evento e passar pelo valor um argumento cujo tipo tem um destruidor. Uma solução neste caso é passar o argumento como uma referência constante.

C2712 também pode ocorrer se você compilar com /clr:pure e declarar uma matriz estática de ponteiros para funções em um __try bloco. Um membro estático requer que o compilador use a inicialização dinâmica em /clr:pure, o que implica manipulação de exceções C++. No entanto, o tratamento de exceções C++ não é permitido em um __try bloco.

/clr:pure e /clr:safe opções de compilador são obsoletas no Visual Studio 2015 e não são suportadas no Visual Studio 2017.

Exemplo

O exemplo a seguir gera C2712 e mostra como corrigi-lo.

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