コードは、変わってないのに致命的に落ちる事が多くなったな?と思って、考え巡らしていたところ、例外機構の処理が関係するんじゃないか?なんて啓示がありまして、こんなコードを追試してみました。
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 件のコメント:
コメントを投稿