#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 类尚未完全解释。
我在生产中拥有此代码。该应用程序似乎在启动时随机崩溃,我想知道这是否是由于这种"糟糕"的设计。
它
被明确声明为未定义的行为:(§ 6.7/4("如果在初始化变量时控件以递归方式重新进入声明,则行为是未定义的。
[是否]上述情况可能存在任何问题,因为 C 构造函数调用 A 字段,而 A 类尚未完全构造。
是的。这可能会给您带来问题,因为行为是未定义的......
在static
A
(a
(完全构造之前初始化C
实例。 然后a
在C
的构造函数中被引用。由于a
不是构造的,因此您可以*进入递归循环。
这就是使用 g++ 构建它时发生的情况。