Order de déinitialisation incorrect sur Solaris G++
j'ai le code suivant:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| #include <cstdio>
struct A
{
A() { printf("A()\n"); }
~A() { printf("~A()\n"); }
static A& getA() { static A a; return a; }
};
struct B
{
B() { A::getA(); printf("B()\n"); }
~B() { printf("~B()\n"); }
};
static B b;
int main(int argc, const char *argv[])
{
return 0;
} |
en gros:
b est une variable globale statique, a est aussi une variable globale (type singleton, si on veut) qui sera initialisée "sur demande" lors du premier appel
Or, le constructeur de B depend de A; donc on devrait avoir le résultat suivant:
et c'est ce que j'obtiens sous Windows, sous linux, sous toutes les plates-formes du monde... sauf sous Solaris. Sous solaris j'obtiens le résultat:
les variables dynamiques sont toutes déinitialisées avant les variables statiques, bien qu'elles aient été construites avant.
Ca marche nickel sur tous les compilateurs et même sur sunCC sur solaris; mais ca m'arrive avec gcc sur solaris.
Quelqu'un a plus d'infos sur ce problème??