// 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;
}
考虑上述情况。我希望这会导致一个无限的引用循环,导致程序无法退出静态去初始化,但程序运行得很好,有以下打印输出:
A
~A
B
~B
A
~A
这是出乎意料的。
编译器如何处理这种情况?它使用什么算法来解决无限递归?或者我误解了一些基本的东西?这是标准中某处定义为未定义的吗?
答案 0 :(得分:6)
编译器有效地存储bool
每个static
以记住它是否已初始化。
这是订单:
内部主要:
A
A
static B
清理静电:
static B
static A
static A
3.6.3 / 1指定它应该以这种方式工作,即使在清理过程中构造static
也是如此。
答案 1 :(得分:0)
这种行为可能是因为您使用的是静态实例。编译器肯定会处理静态变量的状态,以避免执行多次初始化/取消初始化。