ここから本文です

C++でのこのエラーはどういう意味ですか?

helpme_please_thankyouさん

2014/1/1623:40:16

C++でのこのエラーはどういう意味ですか?

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

ソース::

#include<iostream>

using namespace std;

int main()
{
int x,y;

x=5;
y=6;

cout << "変数x " << x << '\n';
cout << "変数y " << y << '\n';

return 0;

閲覧数:
1,026
回答数:
4

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

n2q37さん

編集あり2014/1/1717:15:23

たとえば、

struct sample {
~sample()
{
OutputDebugString(TEXT("~sample()\n"));
}
};

void f()
{
throw 1;
}
void g()
{
sample x;
f();
}
int main()
{
try {
g();
}
catch (int n) {
}
return 0;
}

ここで g 関数に注目。sample 型の変数 x なんですけども、デストラクタが呼び出されてほしいですよね。当然です。それが C++ というもの。

f 関数で例外が投入され、それが main 関数で捕捉されるわけですが、その途中経路にある自動変数はすべて破棄されます。その「破棄」の際、デストラクタが呼び出されるのは当然だということ。

しかし、考えてみればわかりますけど、それ、結構大変なことですよ。どうやって処理するのって話。自動変数をもれなく片付けるというのは C 言語レベルの場合はまず何も考える必要が無く、ただスタックポインタが変わるだけです。ていうか、それをきちんとやらないと関数呼び出し自体がまともに出来なくなりますので当たり前なんですけど。

で、C++だと、例外が起きたときのためのデストラクタ呼び出しの仕掛けというものが、それなりの規模をもった機械語コードシーケンスになってくる。それが、原則的に全部の関数に入ってきます。実行時には呼び出された経路を逆順に辿って、そのコードシーケンスが実行される形ですよ。何と壮大なるドラマ!ちょっと大げさでした。すみません。

そんな例外処理の機構ですけれども、もったいないという見方も出来ます。メモリのことは、まず良いとしても実行時間のことは気になる場面もあるでしょう。何億回、何兆回も繰り返す処理、データベース系、画像処理系、等々なら当然?あ、ちょっと違いますね、これ。例外が投入された後の話なので正常系だったら関係ない話でした。すみません。とすると、標準のC/C++ ランタイムライブラリを使いたくないケースが考えられます。その場合、例外処理の機構を使ってしまうとライブラリが使われることになるので。

いずれにしろプログラマが例外は起こしませんよ、あるいは例外が起きてもデストラクタの呼び出しは行わない…って心に決めたら、それをどうにかしてコンパイラに伝えてやる、と、そのデストラクタ呼び出しの機械語コードシーケンスを生成しないという仕掛けがあったりするのです。

Visual C++ の場合、ビルド設定で例外処理の機構を無効化できます。エラーメッセージがオプションを示している通りです。もうひとつは、個別の関数に書く。__declspec(nothrow) という記述を加えることで、その関数は例外を投入しませんよという意味になる。

このたびのご相談は、例外の処理機構を使用しないという設定になっていたのに、throw を使っているじゃないですか!っていうこと。え?throw 使っていない?いや、テンプレートライブラリを使っていますよね。STL。その中の話。

対処法は言うまでもありません。ビルド設定を正しい形に戻すこと。それだけです。

質問した人からのコメント

2014/1/23 08:17:48

ありがとうございます。................

ベストアンサー以外の回答

1〜3件/3件中

並び替え:回答日時の
新しい順
|古い順

jtaka451さん

2014/1/1702:46:56

ちなみにUnwindってのは大域脱出のことらしい。
http://d.hatena.ne.jp/w_o/20051104
http://msdn.microsoft.com/ja-jp/library/hh254939.aspx
スタックの中身を巻き戻し(unwind)するってことっぽい。

2014/1/1700:20:11

エラーじゃなくて警告だね。(エラーだと実行ファイルは生成されないけど、警告の場合は生成される。)
エラーコードとメッセージから Visual Studio だってわかるけど、一応、開発環境は書いておいた方がいいよ。( 念のため、2010 なのか 2012 なのか、とかも。)

よくわからない説明だけど、とりあえず、
http://msdn.microsoft.com/ja-jp/library/1deeycx5(v=vs.90).aspx
http://msdn.microsoft.com/ja-jp/library/2axwkyt4(v=vs.90).aspx
あたりを読むとよいかと。

簡単に言うと、
プロジェクトのプロパティ →「構成プロパティ」→「 C/C++ 」 → 「コード生成」 → 「 C++の例外を有効にする」
を「はい (/EHsc)」にしてね、ってことだね。

distrofreakさん

2014/1/1700:13:36

コンパイラ名ぐらい書きましょうね。

http://support.microsoft.com/kb/154419/ja
ここのQ10に、公式の回答があります。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問や知恵ノートは選択されたID/ニックネームのMy知恵袋で確認できます。