在另一个构造函数中实例化的对象的构造函数内调用函数


#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实例。 然后aC的构造函数中被引用。由于a不是构造的,因此您可以*进入递归循环。

这就是使用 g++ 构建它时发生的情况。

最新更新