ローカルな静的オブジェクトのデストラクタはまともに呼ばれるのか?
ふと気になって、簡単なテストをしてみた。
#include <iostream> #include <cstdlib> struct foo { foo(int n):i(n){} ~foo(){ std::cout << "foo::~foo:" << i << std::endl; } private: int i; }; void bar(int i) { if(i) { static foo x(3); } static foo y(2); } void func1() { std::cout << "func1" << std::endl; } void func2() { static foo y(1); std::cout << "func2" << std::endl; } void func3() { std::cout << "func3" << std::endl; } int main(int argc, char**) { std::atexit(func1); bar(argc==1); std::atexit(func2); bar(argc!=1); std::atexit(func3); return 0; }
watcom,bcc,dmcでは正しい順序でデストラクタが呼ばれなかった。
gcc@cygwinでは、atexitで登録された関数内の静的オブジェクトのデストラクタが呼ばれなかった。
VCとgcc@mingwでは、正しい順序で呼ばれた。
しかし、デストラクタを呼び出すコードをatexitを使って登録している。
atexitでの登録が失敗する可能性を無視している。これでいいのか?
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=11189
GCCは修正する気がないようだ。
追記
win32api の ExitProcess を使って終了させた場合もやはり、デストラクタが呼び出されない。