// edited by Neil Butterworth to conserve vertical space
#include <stdio.h>
struct A;
struct B;
A& GetAInstance();
B& GetBInstance();
struct A {
A() {
printf("A\n");
}
~A() {
printf("~A\n");
B& b = GetBInstance();
}
};
struct B {
B() {
printf("B\n");
}
~B() {
printf("~B\n");
A& a = GetAInstance();
}
};
A& GetAInstance() {
static A a;
return a;
}
B& GetBInstance() {
static B b;
return b;
}
int main() {
A a;
}
Considérons le scénario ci-dessus. Je pense que cela le résultat dans une boucle infinie de référence résultant du programme étant incapable de quitter de-initialisation statique, mais le programme couru très bien avec l'impression suivante:Comment le compilateur résout-il les boucles de référence infinies?
A
~A
B
~B
A
~A
Ce qui était inattendu.
Comment un compilateur gère-t-il cette situation? Quels algorithmes utilise-t-il pour résoudre la récursion infinie? Ou ai-je mal compris quelque chose de fondamental? Est-ce, quelque part dans la norme, défini comme non défini?
compilé avec: g ++ (GCC) 4.1.2 20.061.115 (préversion) (Debian 4.1.1-21) sur Linux 2.6.18-5-amd64 # 1 SMP x86_64 GNU/Linux –
JJacobsson
Mon mauvais - juste la réparer . –