sl@0: /* sl@0: * The conversation with Matti Rintala on STLport forum 2005-08-24: sl@0: * sl@0: * Do you mean ISO/IEC 14882 3.6.3 [basic.start.term]? sl@0: * sl@0: * Yes. "Destructors (12.4) for initialized objects of static storage duration sl@0: * (declared at block scope or at namespace scope) are called as a result sl@0: * of returning from main and as a result of calling exit (18.3). These objects sl@0: * are destroyed in the reverse order of the completion of their constructor sl@0: * or of the completion of their dynamic initialization." sl@0: * sl@0: * I found a confirmation on the web that gcc may not strictly conform sl@0: * to this behaviour in certains cases unless -fuse-cxa-atexit is used. sl@0: * sl@0: * Test below give (without -fuse-cxa-atexit) sl@0: sl@0: Init::Init() sl@0: Init::use_it sl@0: It ctor done <-- 0 sl@0: Init::use_it done sl@0: Init ctor done <-- 1 sl@0: Init2 ctor done <-- 2 sl@0: It dtor done <-- 0 sl@0: Init2 dtor done <-- 2 sl@0: Init dtor done <-- 1 sl@0: sl@0: sl@0: * but should: sl@0: sl@0: Init::Init() sl@0: Init::use_it sl@0: It ctor done <-- 0 sl@0: Init::use_it done sl@0: Init ctor done <-- 1 sl@0: Init2 ctor done <-- 2 sl@0: Init2 dtor done <-- 2 sl@0: Init dtor done <-- 1 sl@0: It dtor done <-- 0 sl@0: sl@0: sl@0: */ sl@0: #include sl@0: sl@0: using namespace std; sl@0: sl@0: class Init sl@0: { sl@0: public: sl@0: Init(); sl@0: ~Init(); sl@0: sl@0: static void use_it(); sl@0: }; sl@0: sl@0: class Init2 sl@0: { sl@0: public: sl@0: Init2(); sl@0: ~Init2(); sl@0: sl@0: }; sl@0: sl@0: static Init init; sl@0: static Init2 init2; sl@0: sl@0: class It sl@0: { sl@0: public: sl@0: It(); sl@0: ~It(); sl@0: }; sl@0: sl@0: Init::Init() sl@0: { sl@0: printf( "Init::Init()\n" ); sl@0: use_it(); sl@0: printf( "Init ctor done\n" ); sl@0: } sl@0: sl@0: Init::~Init() sl@0: { sl@0: printf( "Init dtor done\n" ); sl@0: } sl@0: sl@0: void Init::use_it() sl@0: { sl@0: printf( "Init::use_it\n" ); sl@0: sl@0: static It it; sl@0: sl@0: printf( "Init::use_it done\n" ); sl@0: } sl@0: sl@0: Init2::Init2() sl@0: { sl@0: printf( "Init2 ctor done\n" ); sl@0: } sl@0: sl@0: Init2::~Init2() sl@0: { sl@0: printf( "Init2 dtor done\n" ); sl@0: } sl@0: sl@0: It::It() sl@0: { sl@0: printf( "It ctor done\n" ); sl@0: } sl@0: sl@0: It::~It() sl@0: { sl@0: printf( "It dtor done\n" ); sl@0: } sl@0: sl@0: int main() sl@0: { sl@0: return 0; sl@0: }