Megosztás a következőn keresztül:


C2712 fordítási hiba

nem használható __try olyan függvényekben, amelyek az objektum kikapcsolását igénylik

Megjegyzések

A C2712 hiba akkor fordulhat elő, ha használ /EHsc, és a strukturált kivételkezeléssel rendelkező függvények olyan objektumokkal is rendelkeznek, amelyek visszatekerést (megsemmisítést) igényelnek.

Lehetséges megoldások:

  • SeH-t igénylő kód áthelyezése másik függvénybe

  • Az SEH-t használó függvények átírása a destruktorokkal rendelkező helyi változók és paraméterek használatának elkerülése érdekében. Ne használjon SEH-t konstruktorokban vagy destruktorokban

  • Fordítás /EHsc nélkül

C2712 hiba akkor is előfordulhat, ha a kulcsszó használatával deklarált metódust __event hív meg. Mivel az esemény többszálú környezetben is használható, a fordító olyan kódot hoz létre, amely megakadályozza a mögöttes eseményobjektum kezelését, majd a létrehozott kódot egy SEH-utasításbatry-finally foglalja. Következésképpen a C2712 hiba akkor fordul elő, ha meghívja az eseménymetódust, és érték szerint átad egy olyan argumentumot, amelynek típusa destruktorsal rendelkezik. Ebben az esetben az egyik megoldás az argumentum állandó hivatkozásként való átadása.

A C2712 akkor is előfordulhat, ha egy blokkban mutató-függvényeket __try tartalmazó statikus tömböt állít össze /clr:pure és deklarál. A statikus tag megköveteli, hogy a fordító dinamikus inicializálást használjon a következő alatt /clr:pure: C++ kivételkezelés. A C++ kivételkezelés azonban nem engedélyezett blokkokban __try .

A /clr:pure és /clr:safe fordítóbeállítások elavultak a Visual Studio 2015-ben, és nem támogatottak a Visual Studio 2017-ben.

példa

Az alábbi példa c2712-t hoz létre, és bemutatja, hogyan javítható ki.

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