Delen via


Compilerfout C2712

kan niet worden gebruikt __try in functies waarvoor objectverwikkeling is vereist

Opmerkingen

Fout C2712 kan optreden als u gebruikt /EHscen een functie met gestructureerde uitzonderingsafhandeling bevat ook objecten die moeten worden afgewikkeld (vernietiging).

Mogelijke oplossingen:

  • Code verplaatsen waarvoor SEH is vereist naar een andere functie

  • Herschrijf functies die gebruikmaken van SEH om het gebruik van lokale variabelen en parameters met destructors te voorkomen. Gebruik SEH niet in constructors of destructors

  • Compileren zonder /EHsc

Fout C2712 kan ook optreden als u een methode aanroept die is gedeclareerd met behulp van het __event trefwoord. Omdat de gebeurtenis kan worden gebruikt in een omgeving met meerderereads, genereert de compiler code die manipulatie van het onderliggende gebeurtenisobject voorkomt en plaatst de gegenereerde code vervolgens in een SEH-instructietry-finally. Fout C2712 treedt daarom op als u de gebeurtenismethode aanroept en een argument doorgeeft waarvan het type een destructor heeft. Een oplossing in dit geval is het doorgeven van het argument als een constante verwijzing.

C2712 kan ook optreden als u compileert met /clr:pure en declareert een statische matrix met aanwijzers-naar-functies in een __try blok. Voor een statisch lid moet de compiler dynamische initialisatie gebruiken, /clr:purewat de verwerking van C++-uitzonderingen impliceert. De verwerking van C++-uitzonderingen is echter niet toegestaan in een __try blok.

De /clr:pure opties en /clr:safe compileren zijn afgeschaft in Visual Studio 2015 en worden niet ondersteund in Visual Studio 2017.

Voorbeeld

In het volgende voorbeeld wordt C2712 gegenereerd en ziet u hoe u dit kunt oplossen.

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