次の方法で共有


コンパイラ エラー C2712

オブジェクト アンワインディングが必要な関数内で __try を使用できません。

解説

/EHsc を使用していて、構造化例外処理の関数にアンワインディング (破棄) を必要とするオブジェクトも含まれている場合、エラー C2712 が発生することがあります。

考えられる解決策:

  • SEH を必要とするコードを別の関数に移動します。

  • デストラクターを含むローカル変数とパラメーターを使用しないように、SEH を使用する関数を記述し直します。 コンストラクターまたはデストラクターで SEH を使用しないようにします。

  • /EHsc を使用せずにコンパイルします。

__event キーワードを使用して宣言されたメソッドを呼び出すと、エラー C2712 が発生する場合もあります。 イベントがマルチスレッド環境で使用される場合もあるため、基になるイベント オブジェクトの操作を防止するコードがコンパイラにより生成され、生成されたコードが SEH の try-finally ステートメントで囲まれます。 その結果、イベント メソッドを呼び出し、型にデストラクターが含まれる引数を値渡しで渡すと、エラー C2712 が発生します。 このような場合の解決策の 1 つとして、引数を定数参照として渡します。

/clr:pure を使用してコンパイルし、__try ブロックでポインターから関数への静的配列を宣言する場合も、C2712 エラーが発生することがあります。 静的メンバーの場合、コンパイラが /clr:pure 以下で動的な初期化を使用する必要があります。これにより C++ の例外処理が暗黙的に指定されます。 しかし、__try ブロックでは C++ の例外処理を実行できません。

/clr:pure および /clr:safe コンパイラ オプションは Visual Studio 2015 では非推奨とされており、Visual Studio 2017 ではサポートされていません。

次の例では、C2712 を生成し、その修正方法を示しています。

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