コンパイラの警告 (レベル 1) C4530

C++ 例外処理を使っていますが、アンワインド セマンティクスは有効にはなりません。 /EHsc を指定してください

このコードには C++ の例外処理が使用されていますが、コンパイラ オプションに /EHsc が含まれていません。

解説

例外処理に関して C++ 標準に準拠した C++ コードをビルドするには、コンパイラに /EHsc オプションを指定する必要があります。 標準の C++ の "アンワインド セマンティクス" には、例外がスローされてからそれがキャッチされるまでの間に構築されたオブジェクトとスタック フレームは、必ず破棄してそのリソースを回復するよう規定されています。 このプロセスを "スタックのアンワインド" といいます。

/EHsc は、例外がその格納スタック フレームを通過したときに自動ストレージ オブジェクトのデストラクターを呼び出すコードを生成するようコンパイラに伝えるオプションです。 "自動ストレージ" オブジェクトとは、ローカル変数など、スタックに割り当てられるオブジェクトです。 自動ストレージと呼ばれるのは、関数が呼び出されたときに自動的に割り当てられ、また、制御が戻ったときには自動的に解放されるためです。 "スタック フレーム" は、関数が呼び出されたとき、その自動ストレージと共にスタックに格納されるデータです。

スローされた例外は、いくつかのスタック フレームを伝ってキャッチされます。 これらのスタック フレームは、例外が通過したら、逆の呼び出し順序でアンワインドされなければなりません。 各スタック フレーム内の自動ストレージ オブジェクトを破棄して、そのリソースをきちんと回復する必要があります。 その破棄と回復のプロセスは、関数から正常に制御が戻ったときに自動的に実行されるものと同じです。

/EHsc オプションを有効にしなかった場合、例外をスローする関数から例外がキャッチされた関数までの間にあるスタック フレーム内の自動ストレージ オブジェクトが破棄されません。 破棄されるのは、try または catch ブロックで作成された自動ストレージ オブジェクトだけであるため、著しいリソース リークなど予期しない動作につながります。

実行可能ファイルで例外がスローされるおそれがない場合、この警告は無視してかまいません。 コードによっては、他の例外処理オプションが必要になる場合もあります。 詳細については、/EH に関するページを参照してください。

次の例では C4530 が生成されます。

// C4530.cpp
// compile with: /W1
int main() {
   try{} catch(int*) {}   // C4530
}

警告を解決するには、/EHsc を使用してサンプルをコンパイルします。