ページ 11

C++ 例外について

Posted: 2014年2月11日(火) 13:57
by NN
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と書き込まれることを期待していたのですが、何もおこりませんでした。
例外でスコープを脱出したときにデストラクタが呼び出されるようにするにはどうしたらいいですか。よろしくお願いします。

Re: C++ 例外について

Posted: 2014年2月11日(火) 14:36
by a5ua
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()が呼ばれるため、デストラクタは呼ばれませんでした。

Re: C++ 例外について

Posted: 2014年2月11日(火) 16:26
by NN
ありがとうございます。自分の環境でも、std::terminate()が呼ばれてもデストラクタが呼び出されませんでした。それが原因だったようです。