我有一段已经使用了很长时间的代码,其代码如下。
有两个类,A
和B
。
A
类有一个公共静态变量static B* pB;
B
类有一个静态对象(static B instance;
)。
在B
构造函数中,我设置了A::pB = this;
我的问题是,由于静态变量初始化顺序未定义,如果b::instance
在A::pB
之前初始化,则首先调用B
构造函数并尝试设置A::pB
这是未初始化的,是否会导致问题?
我当前的代码运行时没有任何意外行为。想知道这是不是我的运气
(A::pB
和B::instance
的初始化发生在不同的翻译单元中)
答案 0 :(得分:3)
初始化有三个部分,零初始化, 静态初始化和动态初始化。 (零 初始化实际上是静态初始化的一部分,但是 保持它们分开通常很方便。)它们发生在 那个命令。
如果您没有为static B* A::pb;
指定任何初始化,
它将被初始化为零(在其他任何东西之前),什么也没有
其他。如果指定常量初始值设定项,例如
B* A::pb = nullptr;
,这也将在任何动态初始化之前发生。
构造函数中发生的是动态初始化,所以
除非A::pb
,否则您的代码应该没有问题
有动态初始化,如:
B* A::pb = someFunctionReturningABStar();
最后:指针的默认构造函数是微不足道的;该
指针有效地构建了#34;程序加载时,
在执行任何代码之前。所以永远不会有问题
由于在构造函数中分配给pB
。唯一的问题
如果有指针的动态初始化,可能会发生,
这可能发生在构造函数中的赋值之后
B::instance
,并覆盖它。
当然,直到B::instance
构建,任何其他
代码将在A::pb
中看到空指针。