コードは、変わってないのに致命的に落ちる事が多くなったな?と思って、考え巡らしていたところ、例外機構の処理が関係するんじゃないか?なんて啓示がありまして、こんなコードを追試してみました。
x.cpp
#include <iostream> class A { public: A() { std::cout << "A()" << std::endl; } ~A() { std::cout << "~A()" << std::endl; } }; int main() { int* n = 0; try { A a; *n = 3; } catch(...) { std::cerr << "catch" << std::endl; } return 0; }
これに対して cl /EHsc /GR /MD x.cpp
C:\MyWorks>x A()で、あぼーん
一方 cl /EHa /GR /MD x.cpp
C:\MyWorks>x A() ~A() catchで、めでたし。
普通は、/EHa を使う方がいいのねん。
とまぁ、こんな初歩的なコンパイラ・オプションにまつわるお話でした。
2011/08/23 追記: Windows2003 までは、DCOM におけるアプリケーション例外は、スレッドからサービスに影響する事がありませんでした。Windows2008 からは、キャッチされなかった例外は、即サービス停止に繋がるようになりました。
0 件のコメント:
コメントを投稿