C++ 例外について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
NN

C++ 例外について

#1

投稿記事 by NN » 11年前

http://ja.wikipedia.org/wiki/%E3%83%87% ... F%E3%82%BF
wikipedia デストラクタのページに、"自動変数のデストラクタは、例外でスコープを脱出した際にも呼び出される"。
とあるのですが、自分で試してみたところ、デストラクタが呼び出されていません。
書いたコードは下のコードです。

コード:

class Class
{
public:
	~Class(){
		std::ofstream ofs("test.txt", std::ios::out);
		ofs << "Class" << std::endl;
	}
};

int main()
{
	Class c;
	throw 1;

	return 0;
}
throw1が呼び出された後、Classのデストラクタが呼び出され、test.txtにClassと書き込まれることを期待していたのですが、何もおこりませんでした。
例外でスコープを脱出したときにデストラクタが呼び出されるようにするにはどうしたらいいですか。よろしくお願いします。

アバター
a5ua
記事: 199
登録日時: 14年前

Re: C++ 例外について

#2

投稿記事 by a5ua » 11年前

throw 1;に対応する例外ハンドラが無いので、std::terminate()が呼ばれてプログラムが強制終了します。
以下のように例外ハンドラを記述すれば、デストラクタが呼ばれます。

コード:

int main()
{
	try {
		Class c;
		throw 1;
	} catch (...) {

	}
	return 0;
}
ちなみに、std::terminate()が呼ばれたときにローカル変数のデストラクタが呼ばれるかどうかは
処理系の実装依存みたいです。参考: http://en.cppreference.com/w/cpp/error/terminate
私の手元の環境(VC++2010)ではabort()が呼ばれるため、デストラクタは呼ばれませんでした。

NN

Re: C++ 例外について

#3

投稿記事 by NN » 11年前

ありがとうございます。自分の環境でも、std::terminate()が呼ばれてもデストラクタが呼び出されませんでした。それが原因だったようです。

閉鎖

“C言語何でも質問掲示板” へ戻る