#include <iostream>
struct D{};
struct B{};
struct C
{
C();
};
struct A
{
A();
B * b;
C * c;
D * d;
static A& pInstance()
{
static A a;
return a;
}
};
A::A()
{
b = new B;
c = new C;
d = new D;
}
C::C()
{
A::pInstance().b;
}
int main()
{
A::pInstance();
std::cin.ignore();
}
上述情况是否存在任何问题,因为C构造函数调用A字段而A类尚未完全构建。
我已将此代码投入生产。应用程序似乎在启动时随机崩溃,我想知道这是否可能是由于这种“糟糕”的设计。
答案 0 :(得分:5)
明确声明为 Undefined Behavior :(§6.7/ 4)“如果控件在初始化变量时递归地重新输入声明,则行为未定义。”
答案 1 :(得分:1)
[是]上述情况可能存在任何问题,因为C构造函数调用A字段而A类尚未完全构造。
是。这可能会导致您the behaviour is undefined...
出现问题在完全构建C
static
(A
)之前,您初始化a
的实例。然后在a
的构造函数中引用C
。由于未构造a
,您可以*进入递归循环。