Erreur du compilateur C2712

ne peut pas être utilisé __try dans les fonctions qui nécessitent un déroulement d’objet

Notes

L’erreur C2712 peut se produire si vous utilisez /EHsc, et une fonction avec gestion structurée des exceptions a également des objets qui nécessitent un déroulement (destruction).

Solutions possibles :

  • Déplacez le code nécessitant la gestion structurée des exceptions vers une autre fonction.

  • Réécrivez les fonctions qui utilisent la gestion structurée des exceptions pour éviter l'utilisation de variables locales et de paramètres possédant des destructeurs. N'utilisez pas la gestion structurée des exceptions dans les constructeurs ni les destructeurs.

  • Compilez sans /EHsc.

L’erreur C2712 peut également se produire si vous appelez une méthode déclarée à l’aide du __event mot clé. Étant donné que l’événement peut être utilisé dans un environnement multithread, le compilateur génère du code qui empêche la manipulation de l’objet d’événement sous-jacent, puis place le code généré dans une instruction SEH.try-finally Par conséquent, l’erreur C2712 se produit si vous appelez la méthode d’événement et passez par valeur un argument dont le type possède un destructeur. Dans ce cas, une solution consiste à passer l'argument en tant que référence constante.

C2712 peut également se produire si vous compilez /clr:pure et déclarez un tableau statique de pointeurs vers des fonctions dans un __try bloc. Un membre statique exige que le compilateur utilise l’initialisation dynamique sous /clr:pure, ce qui implique la gestion des exceptions C++. Toutefois, la gestion des exceptions C++ n'est pas autorisée dans un bloc __try.

Les /clr:pure options du compilateur et /clr:safe des options sont déconseillées dans Visual Studio 2015 et non prises en charge dans Visual Studio 2017.

Exemple

L'exemple suivant génère l'erreur C2712 et montre comment la corriger.

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